.net - Få gruppemedlemskab hurtigt

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at finde ud af om den nuværende Windows-bruger enten er lokal administrator eller kan bruge UAC til at 'opnå' det gruppemedlemskab.


Hvad jeg har hørt så langt ser ud som dette:


var adminIdentifier = new SecurityIdentifier("S-1-5-32-544");
var current = WindowsIdentity.GetCurrent();
bool isAdmin = current.Groups.Contains(adminIdentifier);
bool canBeAdmin = isAdmin;

if (!isAdmin)
{
    var adminGroupName = adminIdentifier.Translate(typeof(NTAccount)).Value;
    adminGroupName = adminGroupName.Substring(adminGroupName.LastIndexOf('\'));
    string path = "WinNT://./" + adminGroupName + ",group";

    using (DirectoryEntry groupEntry = new DirectoryEntry(path))
    {
      foreach (object member in (IEnumerable)groupEntry.Invoke("Members"))
      {
        using (DirectoryEntry memberEntry = new DirectoryEntry(member))
        {
              object obVal = memberEntry.Properties["objectSid"].Value;
              SecurityIdentifier sid = null;
              if (null != obVal)
              {
                 sid = new SecurityIdentifier((Byte[])obVal,0);
              }

              canBeAdmin = Equals(current.User, sid);
              if (canBeAdmin)
                break;
        }
     }
   }
 }
 Console.WriteLine(canBeAdmin +" "+isAdmin);


Denne løsning tager nogle millisekunder at beregne. Meget hurtigere end System.DirectoryServices.AccountManagement baseret tilgang jeg prøvede før.


Der er en sidste ting, der plager mig selv. Jeg skal oversætte SecurityIdentifier af admin gruppen til navnet. Der burde være en måde at få
DirectoryEntry direkte ved at bruge SID. Ifølge Google bør dette fungere:


string path = "LDAP://<SID=" + adminIdentifier.ToString() + ">";


Dette ser imidlertid ikke ud til at fungere. Enhver ide om hvordan syntaksen skal se ud?

Bedste reference


Har du prøvet WindowsPrincipal.IsInRole? [5]


WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent());
wp.IsInRole(new SecurityIdentifier("S-1-5-32-544"));
wp.IsInRole(WindowsBuiltInRole.Administrator);

Andre referencer 1


Har du forsøgt at bruge GetAuthorizationGroups på UserPrincipal-objektet, der svarer til den aktuelle bruger? Det kan være nødvendigt at kontrollere, om brugeren er direkte i gruppen af ​​lokale administratorer, eller om gruppen af ​​lokale administratorer indeholder en af ​​de autorisationsgrupper, som brugeren er i, hvis GetAuthorizationGroups ikke inkluderer maskin-lokale grupper. Jeg har ikke prøvet dette med en maskinkontekst, så jeg er ikke sikker på, om du også skal søge i domænenes kontekst for sidstnævnte kamp, ​​hvis den ikke beregner det lokale gruppemedlemskab ved hjælp af domæne/globale/universelle grupper, når du bruger maskinens kontekst.]]

Andre referencer 2


Dette skal være, hvad du vil, medmindre jeg misforstår:


var groupName = adminIdentifier.Translate(typeof(NTAccount)).Value;