c# ping

Привет! Зарегистрируйте свой аккаунт сегодня, чтобы стать участником! После входа в систему вы сможете участвовать на этом сайте, добавляя свои собственные темы и сообщения. Преимущество регистрации, даёт возможность целиком и полностью пользоваться всеми сервисами форума!

Active Directory Логин, получение данных

Роман Кощеев

...
Проверен
Best answers
0
Всем привет.
Сегодня хочу поделиться знаниями с Active Directory, а именно :
1. Попробуем залогинится.
2. Получим данные того или иного пользователя.

Первоначально подключим пространство имён
C#:
using System.DirectoryServices;
using System.DirectoryServices.Protocols;
Для проверки логина и пароля будем использовать возвращаемую булевую
На форму бросим два TextBox'а и одну кнопку
C#:
 public bool ValidateUser(string userName, string password)
        {
            bool validation;
            try
            {
                LdapConnection ldc = new LdapConnection(new LdapDirectoryIdentifier((string)null, false, false));
                NetworkCredential nc = new NetworkCredential(userName, password, "Your Domain");
                ldc.Credential = nc;
                ldc.AuthType = AuthType.Negotiate;
                ldc.Bind(nc); // user has authenticated at this point, as the credentials were used to login to the dc.
                validation = true;
            }
            catch (LdapException ldap_ex)
            {
                validation = false;
                MessageBox.Show(ldap_ex.Message + "\r\n" + ldap_ex.ServerErrorMessage, ldap_ex.HelpLink, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            return validation;
        }
А проверять будем так
C#:
private void Button1_Click(object sender, EventArgs e)
        {
            if(ValidateUser(textBox1.Text, textBox2.Text))
            {
                MessageBox.Show("Логин и пароль верны!");
            }
        }
И всё!
Но залогиниться это одно, но вот теперь получим данные попробуем

Закинем на форму ListView один ComboBox и ещё один TextBox
Добавим так же контекстное меню и будем вызывать.

C#:
 public void GetDomaiUsers(RichTextBox rtb)
        {
            var dirEntry = new DirectoryEntry(string.Format("LDAP://{0}/{1}", "x-y.z", "OU=Users,DC=x-y,DC=z"));
            var searcher = new DirectorySearcher(dirEntry)
            {
                Filter = "(&(&(objectCategory=person)(objectClass=user)))"
                //Тут укажем фильтр поиска
            };

            foreach (SearchResult result in searcher.FindAll())
            {         
                var entry = result.GetDirectoryEntry();
                de = result.GetDirectoryEntry();
                string ADName, Test, I, F, EMail, MobileNumber, NumberFull, guid;
                try
                {                 
                    comboBox1.Items.Add(entry.Properties["cn"].Value);
                    ListViewItem item = new ListViewItem(new string[] {
                    ADName = entry.Properties["cn"].Value != null ? entry.Properties["cn"].Value.ToString() : "NoN",
                    F = entry.Properties["sAMAccountName"].Value != null ? entry.Properties["sAMAccountName"].Value.ToString() : "NoN",
                    EMail = entry.Properties["mail"].Value != null ? entry.Properties["mail"].Value.ToString() : "NoN",
                    MobileNumber = entry.Properties["mobile"].Value != null ? entry.Properties["mobile"].Value.ToString() : "NoN",
                    NumberFull = entry.Properties["telephoneNumber"].Value != null ? entry.Properties["telephoneNumber"].Value.ToString() : "NoN",
                     Test = entry.Properties["adminDescription"].Value != null ? entry.Properties["adminDescription"].Value.ToString() : "NoN",
                     guid = entry.Guid.ToString(),
                });
                    listView1.Items.Add(item);
                }
                catch { }

            }
        }
Фильтры поиска можно найти на MSDN
В ListView Добавили, теперь будем у каждого полученного пользователя узнавать все данные по атрибутам
Все атрибуты можно найти здесь
Их не мало, и во всех не смог разобраться.



C#:
private void ПоАтрибутуToolStripMenuItem_Click(object sender, EventArgs e)
        {
            richTextBox1.Clear();
            string show;
            var dirEntry = new DirectoryEntry(string.Format("LDAP://{0}/{1}", "x-y.z", "OU=Users,DC=x-y,DC=z"));
            var searcher = new DirectorySearcher(dirEntry)
            {
                Filter = $"(&(&(objectCategory=person)(objectClass=user)(cn={listView1.SelectedItems[0].Text})))"
            };
            foreach (SearchResult result in searcher.FindAll())
            {
                var entry = result.GetDirectoryEntry();
                try
                {
                    show = entry.Properties[attribute.Text].Value != null ? entry.Properties[attribute.Text].Value.ToString() : "NoN";                  
                    MessageBox.Show(show, listView1.SelectedItems[0].Text);   
                }
                catch (Exception ex) { MessageBox.Show(ex.ToString());
            }
        }

Ну и напоследок узнаем всё что возможно о Юзере

Для начала добавим все атрибуты в массив
C#:
  string[] query = { "accountExpires",
"adminDescription",
"adminDisplayName",
"ADsPath",
"altRecipient",
"altRecipientBL",
"authOrig",
"authOrigBL",
"autoReplyMessage",
"badPasswordTime",
"badPwdCount",
"c (Country)",
"canonicalName",
"Class",
"co (Country)",
"comment",
"company",
"countryCode",
"createTimeStamp",
"deletedItemFlags",
"delivContLength",
"deliverAndRedirect",
"department",
"departmentNumber",
"description",
"directReports",
"displayName",
"displayNamePrintable",
"distinguishedName",
"division",
"dLMemRejectPerms",
"dLMemRejectPermsBL",
"dLMemSubmitPerms",
"dLMemSubmitPermsBL",
"employeeID",
"employeeNumber",
"employeeType",
"extensionData",
"extensionAttribute1 - 15",
"facsimileTelephoneNumber",
"garbageCollPeriod",
"givenName",
"homeDirectory",
"homeDrive",
"homeMDB",
"homeMTA",
"homePhone",
"info",
"initials",
"ipPhone",
"isDeleted",
"isRecycled",
"l (Location)",
"lastKnownParent",
"lastLogoff",
"lastLogon",
"lastLogonTimestamp",
"legacyExchangeDN",
"lockoutTime",
"logonCount",
"logonHours",
"mail",
"mailNickname",
"manager",
"mDBOverHardQuotaLimit",
"mDBOverQuotaLimit",
"mDBStorageQuota",
"mDBUseDefaults",
"memberOf",
"mobile",
"modifyTimeStamp",
"msCOM-UserPartitionSetLink",
"Control-Computed",
"msDS-UserPassword",
"ExpiryTimeComputed",
"msExchHideFromAddressLists",
"msExchHomeServerName",
"msExchMailboxSecurityDescriptor",
"msExchMasterAccountSID",
"msExchOmaAdminWirelessEnable",
"msExchPoliciesExcluded",
"msExchRecipLimit",
"msExchRequireAuthToSendTo",
"msExchUserAccountControl",
"msNPAllowDialin",
"msNPCallingStationID",
"msNPSavedCallingStationID",
"msRADIUSCallbackNumber",
"msRADIUSFramedIPAddress",
"msRADIUSFramedRoute",
"msRADIUSServiceType",
"msRASSavedCallbackNumber",
"msRASSavedFramedIPAddress",
"msRASSavedFramedRoute",
"msSFU30GidNumber",
"msSFU30HomeDirectory",
"msSFU30LoginShell",
"msSFU30Name",
"msSFU30NisDomain",
"msSFU30Password",
"msSFU30UidNumber",
"name",
"Name (ADSI Property)",
"nTSecurityDescriptor",
"objectCategory",
"objectClass",
"objectGUID",
"objectSid",
"otherFacsimileTelephoneNumber",
"otherHomePhone",
"otherIpPhone",
"otherMobile",
"otherPager",
"otherTelephone",
"pager",
"Parent",
"physicalDeliveryOfficeName",
"postalCode",
"postOfficeBox",
"primaryGroupID",
"profilePath",
"protocolSettings",
"proxyAddresses",
"publicDelegates",
"publicDelegatesBL",
"pwdLastSet",
"sAMAccountName",
"scriptPath",
"seeAlso",
"securityProtocol",
"sIDHistory",
"sn (Surname)",
"st (State)",
"streetAddress",
"submissionContLength",
"telephoneNumber",
"textEncodedORAddress",
"title",
"unauthOrig",
"unauthOrigBL",
"url",
"userAccountControl",
"userCertificate",
"userParameters",
"userPrincipalName",
"userWorkstations",
"uSNChanged",
"uSNCreated",
"whenChanged", };
Некоторый атрибуты считываются не быстро поэтому сделаем метод асинхронный
C#:
async private void ИнформацияToolStripMenuItem_Click(object sender, EventArgs e)
        {
            richTextBox1.Clear();
            var dirEntry = new DirectoryEntry(string.Format("LDAP://{0}/{1}", "x-y.z", "OU=Users,DC=x-y,DC=z"));
            var searcher = new DirectorySearcher(dirEntry)
            {
                Filter = $"(&(&(objectCategory=person)(objectClass=user)(cn={listView1.SelectedItems[0].Text})))"
            };
          
            foreach (SearchResult result in searcher.FindAll())
            {
                var entry = result.GetDirectoryEntry();
            try
                {               
                    for (int i = 0; i < query.Length; i++)
                    {                     
                        if(entry.Properties[query[i]].Value != null && entry.Properties[query[i]].Value == entry.Properties[query[i]].Value.ToString())
                        {
                            richTextBox1.Text += query[i] + " - " + entry.Properties[query[i]].Value.ToString() + Environment.NewLine;
                            await Task.Delay(50);
                        }
                    }               
                }
                catch (Exception ex) { MessageBox.Show(ex.ToString()); }
            }
        }
1.png 2.png 3.png

Архив с пробником приложил.
 

Вложения

Сверху