Holen NetbiosName von einem Objekt Userprincipal
-
28-09-2019 - |
Frage
Ich bin mit dem System.DirectoryServices.AccountManagement Teil der .NET-Bibliothek Schnittstelle in ActiveDirectory-.
Mit genannt GetMembers () auf einem Objekt und Groupprincipal filtert die Ergebnisse, ich habe jetzt eine Sammlung von Objekten Userprincipal
GroupPrincipal myGroup; // population of this object omitted here
foreach (UserPrincipal user in myGroup.GetMembers(false).OfType<UserPrincipal>())
{
Console.WriteLine(user.SamAccountName);
}
Das obige Codebeispiel wird Benutzername wie „TestUser1“ ausdrucken. Ich brauche diese in eine Liste aus einer anderen Anwendung in „DOMAIN \ TestUser1“ Format kommt zu vergleichen.
Wie erhalte ich den „DOMAIN“ Teil von dem Userprincipal Objekt?
Ich kann nicht nur append ein bekannter Domain-Name, da es mehr Domänen beteiligt und ich brauche DOMAIN1 \ TestUser1 und DOMAIN2 \ testuser2.
unterscheidenLösung
Sie haben zwei Möglichkeiten, dass ich mir vorstellen kann.
- Parse, oder alles nehmen, die eingeschaltet ist, das Recht der
name@fully.qualified.domain.name
; - Verwenden Sie den
System.DirectoryServices
Namespace.
Ich weiß nicht, über Userprincipal , ich auch nicht über Groupprincipal . Auf der anderen Seite weiß ich einen Arbeits Weg zu achive, was Sie wollen.
[TestCase("LDAP://fully.qualified.domain.name", "TestUser1")]
public void GetNetBiosName(string ldapUrl, string login)
string netBiosName = null;
string foundLogin = null;
using (DirectoryEntry root = new DirectoryEntry(ldapUrl))
Using (DirectorySearcher searcher = new DirectorySearcher(root) {
searcher.SearchScope = SearchScope.Subtree;
searcher.PropertiesToLoad.Add("sAMAccountName");
searcher.Filter = string.Format("(&(objectClass=user)(sAMAccountName={0}))", login);
SearchResult result = null;
try {
result = searcher.FindOne();
if (result == null)
if (string.Equals(login, result.GetDirectoryEntry().Properties("sAMAccountName").Value))
foundLogin = result.GetDirectoryEntry().Properties("sAMAccountName").Value
} finally {
searcher.Dispose();
root.Dispose();
if (result != null) result = null;
}
}
if (!string.IsNullOrEmpty(foundLogin))
using (DirectoryEntry root = new DirectoryEntry(ldapUrl.Insert(7, "CN=Partitions,CN=Configuration,DC=").Replace(".", ",DC="))
Using DirectorySearcher searcher = new DirectorySearcher(root)
searcher.Filter = "nETBIOSName=*";
searcher.PropertiesToLoad.Add("cn");
SearchResultCollection results = null;
try {
results = searcher.FindAll();
if (results != null && results.Count > 0 && results[0] != null) {
ResultPropertyValueCollection values = results[0].Properties("cn");
netBiosName = rpvc[0].ToString();
} finally {
searcher.Dispose();
root.Dispose();
if (results != null) {
results.Dispose();
results = null;
}
}
}
Assert.AreEqual("INTRA\TESTUSER1", string.Concat(netBiosName, "\", foundLogin).ToUpperInvariant())
}
Weitere Informationen oder Links in dieser Frage SO.
C # Active Directory:? Erhalten Sie Domain-Namen anzeigen:
So finden der NetBIOS-Name einer Domain
Andere Tipps
Verwenden Sie die ActiveDs COM-Bibliothek wurde integrierten Namen Übersetzung, das funktioniert und macht keine Annahmen (wie auch andere Antworten hier).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ActiveDs;
namespace Foo.Repository.AdUserProfile
{
public class ADUserProfileValueTranslate
{
public static string ConvertUserPrincipalNameToNetBiosName(string userPrincipleName)
{
NameTranslate nameTranslate = new NameTranslate();
nameTranslate.Set((int)ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME, userPrincipleName);
return nameTranslate.Get((int) ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4);
}
}
}
Haben Sie versucht, die vollständig qualifizierten Domain-Namen diesen anderen App vorbei? Die meisten Windows-API ist nicht beschweren, wenn Sie fully_qualified_domain\USER
tun.
könnten Sie suchen die möglichen Domänen in der user.DistinguishedName Eigenschaft. Ein Benutzer in Domäne 1 sollte die Zeichenfolge „DC = DOMAIN1“ enthalten. Es sollte auf jeden Fall nicht die Zeichenfolge "DC = DOMAIN2".
Wie bereits erwähnt in einer der Kommentare auf die Frage dieses Ich denke, ist eine gute Antwort für jüngerer Zeit:
user.Sid.Translate(typeof(System.Security.Principal.NTAccount)).ToString()