2012-08-20 2 views
3

У меня есть код, который работает в большинстве версий Windows, чтобы определить, работает ли текущий пользователь как администратор. Я видел проблемы, когда наши клиенты используют групповые политики, и это не работает. Теперь я обновил свою рабочую станцию ​​до Windows 8, и код больше не работает. Вот код:Определить, является ли пользователь администратором Windows 8 с помощью C#

[DllImport("advapi32.dll")] 
private static extern int LogonUser(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); 
private const int Logon32LogonInteractive = 2; 
private const int Logon32ProviderDefault = 0; 

public void Run() { 
    var _token;  
    LogonUser(Username, Domain, Password, Logon32LogonInteractive, Logon32ProviderDefault, ref _token); 
    _windowsIdentity = new WindowsIdentity(_token); 
    WindowsPrincipal myPrincipal = new WindowsPrincipal(_windowsIdentity); 
    var isAdmin = myPrincipal.IsInRole(WindowsBuiltInRole.Administrator); 
} 

В этом случае isAdmin является ложным, если оно должно быть правдой. Если кто-то знает правильный способ сделать эту проверку, которая будет работать во всех версиях окон, это было бы здорово. Еще лучше, если кто-то знает, как изменить этот код, чтобы он работал в домене с использованием групповых политик.

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

Спасибо!

+0

Вы пытаетесь написать «один» решение не разумно, потому что его не представляется возможным, в основном потому, что даже между Vista, и 7 метода будет отличаться. Напишите решения, направленные на каждую операционную систему. –

ответ

2

Ваш код не будет работать, если UAC включен в Windows Vista и более поздних версиях. Для quote the documentation:

Примечание: В Windows Vista, User Account Control (UAC) определяет привилегии пользователя. Если вы являетесь членом группы «Встроенные администраторы», вам назначаются два токена доступа во время выполнения: стандартный токен доступа пользователя и токен доступа администратора. По умолчанию вы находитесь в стандартной роли пользователя. При попытке выполнить задачу, требуемую для , административные привилегии вы можете динамически повысить свою роль, используя диалоговое окно Согласия . Код, который выполняет метод IsInRole, не отображает диалоговое окно Согласия . Код возвращает false, если вы находитесь в стандартной роли пользователя, даже если вы находитесь во встроенной группе «Администраторы», . Вы можете повысить свои привилегии до того, как вы выполните код, щелкнув правой кнопкой мыши значок приложения и указав, что вы хотите выполнить в качестве администратора.

isAdmin будет ошибочным, если пользователь не работает с повышенным уровнем. Вы можете задать этот вопрос: In .NET/C# test if process has administrative privileges.

Вы можете попытаться использовать императивный или декларативный требования безопасности для конкретных вещей, которые вы хотите сделать, а не для проверки членства в группах. Они будут бросать SecurityException, если вам не хватает требуемых разрешений, которые вы можете захватить, а затем справиться.

0

попробуйте изменить значение Logon32LogonInteractive 3 - что NETWORK_LOGON

Смежные вопросы