Проблемы с LDAP-путями - PullRequest
       42

Проблемы с LDAP-путями

1 голос
/ 17 октября 2011

Я работаю с LDAP, и я новичок в этом.

Есть ли способ получить домен, когда вы знаете только имя пользователя, пароль, имя сервера

Я пытаюсь сделатьэто:

string ldapPath = "LDAP://serverName";
string uid = username;
string password = pwd;
string qry = String.Format("(uid={0})", uid);
string adsPath = String.Empty;

try
{
    DirectoryEntry nRoot = new DirectoryEntry(ldapPath, null, null, AuthenticationTypes.Anonymous);

    DirectorySearcher ds = new DirectorySearcher(nRoot, qry);
    SearchResult sr = ds.FindOne();

    if (sr != null)
    {
       // we want to retrieve the DN like this: "uid=myuser,ou=People,dc=findlay,dc=edu
       ldapPath = sr.Path; //update where we will bind next
    }

Это не работает, если я не поменяю

 string ldapPath = "LDAP://serverName";

на

 string ldapPath = "LDAP://serverName/DC=mydomain,DC=com";

Любая помощь .. ??

Спасибо

Редактировать rootDSE

string defaultNamingContext;

using (DirectoryEntry rootDSE = new DirectoryEntry("LDAP://serverName/rootDSE", null, null, AuthenticationTypes.Anonymous))
{
    defaultNamingContext = rootDSE.Properties["rootDomainNamingContext"].Value.ToString();
}

Я тоже чувствую, что это решение, но в настоящее время оно не работает для меня .. пожалуйста, помогите!

Ответы [ 4 ]

1 голос
/ 17 октября 2011

Если:

using (DirectoryEntry rootDSE = new DirectoryEntry("LDAP://serverName/DC=mydomain,DC=com") 
{ 
    ... 
} 

работает, вы пытаетесь (не будучи анонимным):

string defaultNamingContext; 

using (DirectoryEntry rootDSE = new DirectoryEntry("LDAP://serverName/rootDSE") 
{ 
    defaultNamingContext = rootDSE.Properties["rootDomainNamingContext"].Value.ToString(); 
}

или

using (DirectoryEntry rootDSE = new DirectoryEntry("LDAP://serverName/rootDSE", user, password) 
{ 
    defaultNamingContext = rootDSE.Properties["rootDomainNamingContext"].Value.ToString(); 
}

У меня работает, с компьютера не в домене.

1 голос
/ 17 октября 2011

Вы сможете получить домен, просто позвонив в RootDse.

1 голос
/ 17 октября 2011

RootDSE не привязан к серверу - попробуйте это:

string defaultNamingContext;

using (DirectoryEntry rootDSE = new DirectoryEntry("LDAP://rootDSE", null, null, AuthenticationTypes.Anonymous))
{
    defaultNamingContext = rootDSE.Properties["defaultNamingContext"].Value.ToString();
}

Или, если вы используете .NET 3.5 и новее, вы можете использовать вместо него PrincipalContext, который может быть создан без какого-либо пути - он просто выберет домен по умолчанию, к которому вы подключены:

PrincipalContext context = new PrincipalContext(ContextType.Domain);

Вы должны проверить пространство имен System.DirectoryServices.AccountManagement (S.DS.AM). Прочитайте все об этом здесь (это .NET 3.5 и новее):

1 голос
/ 17 октября 2011

вы можете попробовать вот так

// Вызов метода

string netBiosName = GetNetBiosName(LDAP://CN=Partitions,CN=Configuration,DC=<DomainName>,DC=<local|com>,  "<userName"", "<password>");

// Вызов метода

// Определение метода

private string GetNetBiosName(string ldapUrl, string userName, string password)
{
   string netbiosName = string.Empty;
  DirectoryEntry dirEntry = new DirectoryEntry(ldapUrl,userName, password);

   DirectorySearcher searcher = new DirectorySearcher(dirEntry);
   searcher.Filter = "netbiosname=*";
   searcher.PropertiesToLoad.Add("cn");

   SearchResultCollection results = searcher.FindAll();
   if (results.Count > 0)
   {
    ResultPropertyValueCollection rpvc = results[0].Properties["CN"];
    netbiosName = rpvc[0].ToString();
   }
   return netbiosName;

}

Пожалуйста, посмотрите эту ссылку для получения дополнительной информации

...