VB.NET - So konvertieren Sie SID in Gruppennamen mit Active Directory
-
27-10-2019 - |
Frage
Wie konvertieren Sie die SID mit VB.NET mit Active Directory in den Gruppennamen?
Beispiel: Ich muss "Group_test" und nicht "S-1-5-32-544" bekommen
Der Code, den ich verwende, ist:
Public ReadOnly Property Groups As IdentityReferenceCollection
Get
Dim irc As IdentityReferenceCollection
Dim ir As IdentityReference
irc = WindowsIdentity.GetCurrent().Groups
Dim strGroupName As String
For Each ir In irc
Dim mktGroup As IdentityReference = ir.Translate(GetType(NTAccount))
MsgBox(mktGroup.Value)
Debug.WriteLine(mktGroup.Value)
strGroupName = mktGroup.Value.ToString
Next
Return irc
End Get
End Property
oder so ähnlich?
currentUser = WindowsIdentity.GetCurrent()
For Each refGroup As IdentityReference In currentUser.Groups
Dim acc As NTAccount = TryCast(refGroup.Translate(GetType(NTAccount)), NTAccount)
If AdminGroupName = acc.Value Then
ret = "999"
End If
If UsersGroupName = acc.Value Then
ret = "1"
End If
Wie würdest du es an diesen Code anpassen? (Wenn der Benutzer in der XX -Gruppe ist, zeigen Sie die XX -Gruppe auf Dropdown -Liste an.)
For Each UserGroup In WindowsIdentity.GetCurrent().Groups
If mktGroup.Value = "BIG" Then
Dim Company = ac1.Cast(Of MarketingCompany).Where(Function(ac) ac.MarketingCompanyShort = "BIG").FirstOrDefault
If Company IsNot Nothing Then
marketingCo.Items.Add(String.Format("{0} | {1}", Company.MarketingCompanyShort, Company.MarketingCompanyName))
End If
End If
Next
Lösung
Hier ist ein einfacher Weg, der in C#geschrieben wird. Ich denke, es ist nicht schwer zu anpassen:
/* Retreiving object from SID
*/
string SidLDAPURLForm = "LDAP://WM2008R2ENT:389/<SID={0}>";
System.Security.Principal.SecurityIdentifier sidToFind = new System.Security.Principal.SecurityIdentifier("S-1-5-21-3115856885-816991240-3296679909-1106");
DirectoryEntry userEntry = new DirectoryEntry(string.Format(SidLDAPURLForm, sidToFind.Value));
string name = userEntry.Properties["cn"].Value.ToString();
Hier ist es in VB .NET dank REFLEKTOR
Dim SidLDAPURLForm As String = "LDAP://WM2008R2ENT:389/<SID={0}>"
Dim sidToFind As New SecurityIdentifier("S-1-5-21-3115856885-816991240-3296679909-1106")
Dim userEntry As New DirectoryEntry(String.Format(SidLDAPURLForm, sidToFind.Value))
Dim name As String = userEntry.Properties.Item("cn").Value.ToString
---- bearbeitet ----- Also hier ist, was Sie wollen, aber es ist dasselbe wie zuvor von @biggStRC gegeben wurde
Private Shared Sub Main(args As String())
Dim currentUser As WindowsIdentity = WindowsIdentity.GetCurrent()
For Each iRef As IdentityReference In currentUser.Groups
Console.WriteLine(iRef.Translate(GetType(NTAccount)))
Next
End Sub
Andere Tipps
Code in C#:
public static string GetGroupNameBySid(string sid)
{
using(var ctx =
new PrincipalContext(ContextType.Domain))
{
using(avr group =
GroupPrincipal.FindByIdentity(
ctx,
IdentityType.Sid,
sid))
{
return group?.SamAccountName;
}
}
}
Sie müssen Assemblersystem hinzufügen. Wenn Sie Probleme mit der Verbindung zur AD haben, können Sie versuchen, den Anzeigennamen im PrincipalContext -Konstruktor hinzuzufügen.
Hier ist ein Link zum Umwandeln eines SID in einen Namen: http://vbdotnet.canbal.com/view.php?sessionid=jef85k%2B%2Bebj9pz%2BWZ9HJICW%2Fyeptadxfcpycovz7js%3d
Grundsätzlich erhalten Sie ein DirectoryEnry -Objekt zurück, mit dem Sie den Namen erhalten können. Wenn Sie jedoch nach einer einfacheren Methode suchen, die ich für eine einfachere Methode halte, nehmen Sie einfach den aktuellen Benutzer und suchen Sie in der Anzeige nach ihren Gruppenmitgliedschaften. Hier ist ein Beispiel dafür, wie dies geht (Sie benötigen den größeren Artikel, um Ihre Aufgabe tatsächlich zu erfüllen, aber dieser Code ist die spezifische Antwort auf Ihre Frage): http://www.codeproject.com/kb/system/Everythinginad.aspx#39
Entschuldigung, dass der Code in C#ist. Sie sollten jedoch in der Lage sein, nur einen Konverter zu verwenden, um ihn ohne Problem in VB.NET zu konvertieren.
Holen Sie sich Benutzergruppenmitgliedschaften des protokollierten Benutzers von ASP.NET in C#
public ArrayList Groups()
{
ArrayList groups = new ArrayList();
foreach (System.Security.Principal.IdentityReference group in
System.Web.HttpContext.Current.Request.LogonUserIdentity.Groups)
{
groups.Add(group.Translate(typeof
(System.Security.Principal.NTAccount)).ToString());
}
return groups;
}
Holen Sie sich die Mitgliedschaften der Benutzergruppe des protokollierten Benutzers von ASP.NET in vb.net unter Verwendung Der Konverter -Tool von Entwickler Fusion:
Public Function Groups() As ArrayList
Dim groups__1 As New ArrayList()
For Each group As System.Security.Principal.IdentityReference In System.Web.HttpContext.Current.Request.LogonUserIdentity.Groups
groups__1.Add(group.Translate(GetType(System.Security.Principal.NTAccount)).ToString())
Next
Return groups__1
End Function