How can I convert from a SID to an account name in C#

后端 未结 10 1047
囚心锁ツ
囚心锁ツ 2020-12-01 02:56

I have a C# application that scans a directory and gathers some information. I would like to display the account name for each file. I can do this on the local system by g

10条回答
  •  日久生厌
    2020-12-01 03:22

    Get the current domain:

    System.DirectoryServices.ActiveDirectory.Domain.GetCurrentDomain();
    

    Get a directory entry from ldap and the domain name:

    DirectoryEntry de = new DirectoryEntry(string.Format("LDAP://{0}", domain));
    

    Get the sid from an ActiveDirectoryMembershipProvider ActiveDirectoryMembershipUser:

    ActiveDirectoryMembershipUser user = (ActiveDirectoryMembershipUser)Membership.GetUser();
    var sid = (SecurityIdentifier)user.ProviderUserKey;
    

    Get the username from the SecurityIdentifier:

    (NTAccount)sid.Translate(typeof(NTAccount));
    

    Get directory search done on an activedirectory with the domain directory entry and username:

    DirectorySearcher search = new DirectorySearcher(entry);
            search.Filter = string.Format("(SAMAccountName={0})", username);
            search.PropertiesToLoad.Add("Name");
            search.PropertiesToLoad.Add("displayName");
            search.PropertiesToLoad.Add("company");
            search.PropertiesToLoad.Add("homePhone");
            search.PropertiesToLoad.Add("mail");
            search.PropertiesToLoad.Add("givenName");
            search.PropertiesToLoad.Add("lastLogon");
            search.PropertiesToLoad.Add("userPrincipalName");
            search.PropertiesToLoad.Add("st");
            search.PropertiesToLoad.Add("sn");
            search.PropertiesToLoad.Add("telephoneNumber");
            search.PropertiesToLoad.Add("postalCode");
            SearchResult result = search.FindOne();
            if (result != null)
            {
                foreach (string key in result.Properties.PropertyNames)
                {
                    // Each property contains a collection of its own
                    // that may contain multiple values
                    foreach (Object propValue in result.Properties[key])
                    {
                        outputString += key + " = " + propValue + ".
    "; } } }

    Depending on the data in your active directory, you will get a varied response in the output.

    Here is a site that has all the user properties I needed:

提交回复
热议问题