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
War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top