C # Active Directory: Abrufen des Domänennamens des Benutzers?
Ich weiß, dass diese Art von Frage gestellt wurde, bevor, aber andere Methoden Versagen, mich jetzt.
So wie es steht, unsere windows-Dienst fragt die ANZEIGE, da ein LDAP (z.B. LDAP://10.32.16.80) und eine Liste von Benutzergruppen innerhalb dieser AD-server zu suchen.
Es ruft alle Benutzer innerhalb dieser Gruppen gegeben, die rekursiv suchen, diese Gruppen weitere Gruppen als gut.
Jeder Benutzer wird dann Hinzugefügt, um andere Anwendungen, die authentifizierte Benutzer-Liste.
In diesem Teil der Anwendung läuft erfolgreich. Wir sind hier jedoch in der Notwendigkeit jeder Benutzer-freundliche domain-Namen (also den Teil Ihrer login-DOMÄNE/Benutzername)
Also, wenn es ein Benutzer, der Domäne TEST, namens Steve: TEST/steve ist seine login -.
Ich bin in der Lage zu finden, die steve in der AD, aber ich brauche auch "TEST" gespeichert werden, zusammen mit seinem AD-information.
Wieder, die ich finden kann 'steve' Ordnung mit einem Verzeichnis Suchenden und dem LDAP-IP ich bin da, aber angesichts der LDAP-IP, wie finde ich die freundliche domain-Namen?
Wenn ich versuche, den folgenden code, den ich bekomme eine Fehlermeldung, wenn Sie versuchen, Zugriff auf die "defaultNamingContext':
System.- Laufzeit.InteropServices.COMException (0x8007202A): Die Authentifizierungs-Mechanismus ist unbekannt.
Hier ist der code:
private string SetCurrentDomain(string server)
{
string result = string.Empty;
try
{
logger.Debug("'SetCurrentDomain'; Instantiating rootDSE LDAP");
DirectoryEntry ldapRoot = new DirectoryEntry(server + "/rootDSE", username, password);
logger.Debug("'SetCurrentDomain'; Successfully instantiated rootDSE LDAP");
logger.Debug("Attempting to retrieve 'defaultNamingContext'...");
string domain = (string)ldapRoot.Properties["defaultNamingContext"][0]; //THIS IS WHERE I HIT THE COMEXCEPTION
logger.Debug("Retrieved 'defaultNamingContext': " + domain);
if (!domain.IsEmpty())
{
logger.Debug("'SetCurrentDomain'; Instantiating partitions/configuration LDAP entry");
DirectoryEntry parts = new DirectoryEntry(server + "/CN=Partitions,CN=Configuration," + domain, username, password);
logger.Debug("'SetCurrentDomain'; Successfully instantiated partitions/configuration LDAP entry");
foreach (DirectoryEntry part in parts.Children)
{
if (part.Properties["nCName"] != null && (string)part.Properties["nCName"][0] != null)
{
logger.Debug("'SetCurrentDomain'; Found property nCName");
if ((string)part.Properties["nCName"][0] == domain)
{
logger.Debug("'SetCurrentDomain'; nCName matched defaultnamingcontext");
result = (string)part.Properties["NetBIOSName"][0];
logger.Debug("'SetCurrentDomain'; Found NetBIOSName (friendly domain name): " + result);
break;
}
}
}
}
logger.Debug("finished setting current domain...");
}
catch (Exception ex)
{
logger.Error("error attempting to set domain:" + ex.ToString());
}
return result;
}
Bearbeiten
Fügte ich dieses Beispiel-Methode, um zu versuchen, einen Vorschlag aber bin immer eine Ausnahme: "Unbekannter Fehler" wenn ich auf den "FindAll ()" - Aufruf auf der searcher.
Die Zeichenfolge wird übergeben: "CN=TEST USER,CN=Users,DC=tempe,DC=ktregression,DC=com"
private string GetUserDomain(string dn)
{
string domain = string.Empty;
string firstPart = dn.Substring(dn.IndexOf("DC="));
string secondPart = "CN=Partitions,CN=Configuration," + firstPart;
DirectoryEntry root = new DirectoryEntry(secondPart, textBox2.Text, textBox3.Text);
DirectorySearcher searcher = new DirectorySearcher(root);
searcher.SearchScope = SearchScope.Subtree;
searcher.ReferralChasing = ReferralChasingOption.All;
searcher.Filter = "(&(nCName=" + firstPart + ")(nETBIOSName=*))";
try
{
SearchResultCollection rs = searcher.FindAll();
if (rs != null)
{
domain = GetProperty(rs[0], "nETBIOSName");
}
}
catch (Exception ex)
{
}
return domain;
TEST
domain unter der gleichen Gesamtstruktur wie der aktuellen domain? Wenn ja, können Sie eine Abfrage der richtigen domain für diesen Benutzer, da der Benutzer möglicherweise gibt es in Ihrem aktuellen Domäne, aber nicht in der anderen. IList<string>
der Domänen, in denen Steve ein Konto hat. Daher kann man nicht sagen, dass die absolute Benutzernamen TEST\Steve
, da Steve vielleicht haben Sie ein anderes Benutzerkonto mit dem gleichen Namen für eine andere domain, sagen wir mal PROD\Steve
. InformationsquelleAutor der Frage ghost_mv | 2010-11-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser Artikel hat mir geholfen, viel zu verstehen, wie die Arbeit mit dem Active Directory.
Howto: (Fast) Alles, was In Active Directory über C#
Ab diesem Punkt, wenn Sie benötigen weitere Hilfe, bitte lassen Sie mich wissen, mit den richtigen Fragen im Kommentar, und ich beantworte Sie für dich zu den besten meines Wissens.
EDIT #1
, Sie hatten besser go mit diesem Beispiel der filter statt. Ich habe geschrieben einige Beispiel-code, kurz zu zeigen, wie die Arbeit mit dem
System.DirectoryServices
undSystem.DirectoryServices.ActiveDirectory
namespaces. Die System.DirectoryServices.ActiveDirectory - namespace wird verwendet, um Informationen über die Domänen innerhalb der Gesamtstruktur.Hier, ich habe nicht diesen code testen, und vielleicht einige kleine Problem zu beheben. Diese Probe wird zur Verfügung gestellt, für den Willen, Ihnen zu helfen. Ich hoffe, das wird helfen.
EDIT #2
Ich fand einen anderen Ausweg:
Im Beispiel unten wird eine NUnit-Testcases, die Sie testen können, für sich selbst und sehen, ob es das macht, was Sie sind erforderlich, um.
Die Quelle, aus der ich inspiriert, mich ist:
Finden Sie den NetBios-Namen der Domäne im AD
InformationsquelleAutor der Antwort Will Marcouiller
Da konnte ich nicht finden alle Beispiel-code würde ich gerne meine eigene Lösung. Diese sucht nach den Eltern des DirectoryEntry-Objekt, bis es trifft das domainDNS-Klasse.
Verwenden Sie es wie diese:
Habe ich noch nicht einen Wald zu testen aber in der Theorie sollte es geschnitten.
InformationsquelleAutor der Antwort Tiele Declercq
Können Sie rufen Sie den Namen der Domäne, zu der der aktuelle Benutzer über die Verwendung der Umwelt.UserDomainName-Eigenschaft.
InformationsquelleAutor der Antwort Mark
Vielleicht nicht ganz korrekt aber...
Da der Wert von de.Pfad ist
InformationsquelleAutor der Antwort DartAlex