Быстро получить членство в группе - PullRequest
4 голосов
/ 04 апреля 2009

Я пытаюсь выяснить, является ли текущий пользователь Windows локальным администратором или может использовать UAC для «достижения» этого членства в группе.

То, что я до сих пор придумал, выглядит так:

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);

Это решение занимает несколько миллисекунд для вычисления. Гораздо быстрее, чем подход, основанный на System.DirectoryServices.AccountManagement, который я пробовал ранее.

Есть одна последняя вещь, которая беспокоит меня, хотя. Я должен перевести SecurityIdentifier группы администраторов на имя. Там должен быть способ получить DirectoryEntry напрямую, используя SID. По словам Google, это должно работать:

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

Однако это не похоже на работу. Любая идея, как должен выглядеть синтаксис?

Ответы [ 3 ]

2 голосов
/ 05 апреля 2009

Вы пробовали WindowsPrincipal.IsInRole ?

WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent());
wp.IsInRole(new SecurityIdentifier("S-1-5-32-544"));
wp.IsInRole(WindowsBuiltInRole.Administrator);
1 голос
/ 04 апреля 2009

Вы пытались использовать GetAuthorizationGroups для объекта UserPrincipal, соответствующего текущему пользователю? Возможно, вам придется проверить, входит ли пользователь непосредственно в группу локальных администраторов или содержит ли группа локальных администраторов какую-либо из групп авторизации, в которую входит пользователь, если GetAuthorizationGroups не включает локальные группы компьютеров. Я не пробовал это с машинным контекстом, поэтому я не уверен, нужно ли вам также искать контекст домена для последнего совпадения, если он не вычисляет членство в локальной группе, используя доменные / глобальные / универсальные группы при использовании машинный контекст.

0 голосов
/ 05 апреля 2009

Это должно быть то, что вы хотите, если я не понимаю:

var groupName = adminIdentifier.Translate(typeof(NTAccount)).Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...