Мне нужно проверить, у каких пользователей Windows есть права администратора.
Хорошо, теперь внимательно прочтите: НЕ ТЕКУЩИЙ ПОЛЬЗОВАТЕЛЬ. Я запрашиваю все локальные учетные записи пользователей, затем проверяю, какая из них имеет права администратора. Скажем, я вошел в систему как Джо, мое приложение работает в контексте пользователя Джо, но на этом самом ПК есть пользователь Тимми, который в настоящее время не вошел в систему. Мне нужно проверить, есть ли у Тимми администратор на этом компьютере. Итак, этот вопрос определенно не о привилегиях текущего пользователя;) Итак, это точно не дубликат аналогичных вопросов об определении привилегий текущего пользователя. Этот другой;)
Вот мой код:
public static dynamic[] Users => WMI.Query("SELECT * FROM Win32_UserAccount WHERE Disabled = 0").Select<dynamic, dynamic>(d => {
var machineContext = new PrincipalContext(ContextType.Machine);
Principal principal = Principal.FindByIdentity(machineContext, d.SID);
d.IsAdmin = principal.IsMemberOf(machineContext, IdentityType.Name, "Administrators");
principal.Dispose();
machineContext.Dispose();
return d;
}).ToArray();
Это работает, но для выполнения IsMemberOf()
требуется более 2 секунд. Есть ли более быстрый способ сделать это? Почему так медленно?
Если вам интересно, что здесь делает WMI.Query
, он просто запрашивает WMI и возвращает результат в виде массива управляемых dynamic
объектов вместо IDisposable
типов. IDisposable
типов удаляются до того, как будет возвращен результат. Хотя это не имеет отношения к вопросу.
Чтобы уточнить, я использую System.DirectoryServices.AccountManagement
, чтобы получить фактическую учетную запись пользователя из SID. Я не знаю, можно ли создать WindowsIdentity
из SID. AFAIK это не может. Пользователь WindowsIdentity
должен войти в систему (в противном случае выдает исключение SecurityException), и я запрашиваю всех локальных пользователей, а не только текущего.
principal.IsInRole(WindowsBuiltInRole.Administrator)
? - person kgzdev   schedule 27.01.2017System.Security.Principal.WindowsPrincipal
, этоSystem.DirectoryServices.AccountManagement.Principal
. Я знаю, что между этими двумя типами нет никакой конверсии. - person Harry   schedule 27.01.2017