2010-11-23 4 views
1

Ich habe einen Client, der einen Windows-Dienst verwendet, den ich schrieb, der einen angegebenen Active Directory-LDAP-Server für Benutzer in bestimmten Gruppen innerhalb dieses LDAP-Servers abfragt.Active Directory: Get RootDSE in Domäne mit mehreren Wurzeln in Gesamtstruktur?

Sobald ein Benutzer gefunden wird, werden die Benutzerinformationen (z. B. Benutzername, E-Mail usw.) ausgefüllt und versucht, die Domäne des Benutzers innerhalb dieses LDAP-Servers abzurufen.

Wenn ich versuche, die Domäne des Benutzers für diesen bestimmten Client abzurufen, treffe ich eine DirectoryServicesCOMException: Anmeldefehler: unconwn Benutzername oder falsches Kennwort. Diese Ausnahme wird ausgelöst, wenn ich versuche, auf eine Eigenschaft im RootDSE DirectoryEntry-Objekt, das ich instanziiere, zu verweisen.

Dieser Client hat eine Gesamtstruktur mit zwei Wurzeln, wie folgt eingerichtet.

Active Directory-Domänen und -Vertrauensstellungen

  • ktregression.com

  • ktregression.root

Ich nehme an, das ist die Frage. Gibt es einen Weg dazu? Gibt es eine Möglichkeit, den NetBIOS-Namen eines bestimmten Domänenobjekts noch abzurufen, ohne diese Ausnahme aufzurufen?

Hier einig Beispielcode zu einem Test AD-Server-Setup zeigt, wie zuvor dokumentiert:

 string domainNameLdap = "dc=tempe,dc=ktregression,dc=com"; 

     DirectoryEntry RootDSE = new DirectoryEntry (@"LDAP://10.32.16.6/RootDSE"); 
     DirectoryEntry servers2 = new DirectoryEntry (@"LDAP://cn=Partitions," + RootDSE.Properties["configurationNamingContext"].Value); //*****THIS IS WHERE THE EXCEPTION IS THROWN******** 

     //Iterate through the cross references collection in the Partitions container 
     DirectorySearcher clsDS = new DirectorySearcher(servers2); 
     clsDS.Filter = "(&(objectCategory=crossRef)(ncName=" + domainNameLdap + "))"; 
     clsDS.SearchScope = SearchScope.Subtree; 
     clsDS.PropertiesToLoad.Add("nETBIOSName"); 

     List<string> bnames = new List<string>(); 

     foreach (SearchResult result in clsDS.FindAll()) 
      bnames.Add(result.Properties["nETBIOSName"][0].ToString()); 
+0

Haben Sie sichergestellt, dass entweder 'RootDSE.Properties [" configurationNamingContext "]. Value' einen Wert zurückgibt, der eigentlich nicht Null ist, oder die LDAP-Nomenklatur von LDAP: // CN = Partitions, DC = ktregression berücksichtigt , DC = com 'oder dergleichen? –

+0

Haben Sie das Codebeispiel, das ich Ihnen für Ihre andere ähnliche Frage von gestern zur Verfügung gestellt habe, ausgespäht? –

+0

@Will, yeah Ich habe es mir angeschaut und es versucht. Ich antwortete darauf mit einer anderen Frage. Ich denke aber, dass ich eigentlich zwei getrennte Probleme habe, weshalb ich diese auch begonnen habe. Das Problem, bei dem ich eine Instanz von zwei Wurzeln in einer einzelnen Gesamtstruktur habe. –

Antwort

2

Es scheint, dass das Benutzerkonto, mit dem Active Directory versucht, "Sie" zu authentifizieren, nicht vorhanden ist, da Ihre DirectoryServicesCOMException es meldet.

DirectoryServicesCOMException: Anmeldefehler: unconwn Benutzername oder falsches Kennwort.

Sehen Sie sich Ihre Codebeispiel, wie es scheint Sie verwenden Identitätswechsel nicht, damit das Sicherheitsprotokoll des Active Directory berücksichtigen, die derzeit authentifizierten Benutzer. Machen Sie diesen Benutzer selbst, und wenn Sie nicht auf beiden Domänenwurzeln definiert sind, kennt einer von Ihnen Sie nicht, der diese Art von Ausnahme auslöst.

Auf der anderen Seite könnte die Verwendung von Identitätswechsel das Problem hier lösen, da Sie sagen, dass Ihr Windows-Dienstkonto die Rechte hat, beide Ihre Wurzeln unter der gleichen Gesamtstruktur abzufragen, dann müssen Sie sicherstellen, dass der authentifizierte Benutzer ist Ihr Windows-Dienst.

Im Klartext bedeutet dies, dass Sie ohne Identitätswechsel nicht garantieren können, dass der authentifizierte Benutzer Ihr Windows-Dienst ist. Um sicher zu gehen, ist Identitätswechsel ein Muss.

nun in Bezug auf die beiden Wurzeln

  1. ktregression.com;
  2. ktregression.root.

Dies sind zwei verschiedene und unabhängige Wurzeln. Aus diesem Grund, denke ich, sollten Sie mit zwei Instanzen der DirectoryEntry Klasse gehen, die für jede Wurzel eine ist.

Nachdem Sie die Wurzeln instanziiert haben, müssen Sie nach dem Benutzer suchen, den Sie finden möchten, der ein anderer userName als der sein soll, der imitiert wird.

Wir müssen jetzt angeben, ob ein Benutzer auf beiden Wurzeln definiert werden kann. Wenn es so ist, müssen Sie wissen, wann es besser ist, eines über das andere zu wählen. Und das ist von anderer Sorge.

Hinweis
Aus Gründen der Einfachheit, werde ich es nehmen, dass beide Namen Wurzeln vollständig/full, wie Sie sie erwähnt.

private string _dotComRootPath = "LDAP://ktregression.com"; 
private string _dotRootRootPath = "LDAP://ktregression.root"; 
private string _serviceAccountLogin = "MyWindowsServiceAccountLogin"; 
private string _serviceAccountPwd = "MyWindowsServiceAccountPassword"; 

public string GetUserDomain(string rootPath, string login) { 
    string userDomain = null; 

    using (DirectoryEntry root = new DirectoryEntry(rootPath, _serviceAccountLogin, _serviceAccountPwd)) 
     using (DirectorySearcher searcher = new DirectorySearcher()) { 
      searcher.SearchRoot = root; 
      searcher.SearchScope = SearchScope.Subtree; 
      searcher.PropertiesToLoad.Add("nETBIOSName"); 
      searcher.Filter = string.Format("(&(objectClass=user)(sAMAccountName={0}))", login); 

      SearchResult result = null; 

      try { 
       result = searcher.FindOne(); 

       if (result != null) 
        userDomain = (string)result.GetDirectoryEntry() 
            .Properties("nETBIOSName").Value;          
      } finally { 
       dotComRoot.Dispose(); 
       dotRootRoot.Dispose(); 
       if (result != null) result.Dispose(); 
      } 
     }    

    return userDomain; 
} 

und deren Verwendung:

string userDomain = (GetUserDomain(_dotComRoot, "searchedLogin") 
         ?? GetUserDomain(_dotRootRoot, "searchedLogin")) 
        ?? "Unknown user"; 

Ihre Ausnahme nur auf der zweiten DirectoryEntry initilization geworfen wird, der, dass Ihr Standard aktuelle Benutzer schlägt ein Konto auf dieser Wurzel definiert nicht haben.

EDIT # 1

Bitte lesen Sie meine Antwort unten an deinen anderen NetBIOS-Namen im Zusammenhang Frage:
C# Active Directory: Get domain name of user?
wo ich eine neue schaffen und wahrscheinlich einfache Lösung für Ihr Anliegen.

Lassen Sie mich wissen, wenn Sie weitere Fragen haben. =)

0

Ich glaube, dass die Directory Eigenschaften für ein AD-Konto angeben, hat die LDAP-Abfragen oder Updates durchführen kann, können Sie Delegieren Sie diese Kontrolle auch von Ihrer übergeordneten Domäne.

+0

Max, kannst du das näher ausführen? Haben Sie ein Codebeispiel? –