2013-05-28 4 views
0

мы используем этот код VB.NET внутри класса, так как много лет для тестирования, если данный пользователь является администратором (укорочен для ясности, проверка ошибок удалена):LogonUser в ОС Windows 8

Private Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As UInteger, ByVal dwLogonProvider As UInteger, ByRef phToken As IntPtr) As Boolean 

Private token As IntPtr 
Private identity As WindowsIdentity 
Private principal As WindowsPrincipal 

LogonUser(username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, token) 
identity = New WindowsIdentity(token) 
principal = New WindowsPrincipal(identity) 

Return principal.IsInRole(ApplicationServices.BuiltInRole.Administrator) 

Этот код возвращает True для учетных данных администратора. Этот код работает в Windows XP, Vista и Windows 7. Мы знаем о том, что этот код несовместим с включенным UAC. Поэтому, чтобы этот код работал в Windows Vista и 7, мы отключили UAC. Однако в Windows 8 даже при выключении UAC учетные данные администратора по-прежнему распознаются как ограниченный токен (часть BuiltInRole.User). Таким образом, мы не можем выдавать себя за администратора «identity.Impersonate».

Любые идеи, почему этот код был поврежден в Windows 8?

Спасибо Alex

+2

Он был поврежден в Windows Vista. Требование, чтобы UAC был отключен, чтобы заставить ваше приложение работать, считается «сломанным». –

+0

Ну, это не то, о чем я просил. Я хочу знать, почему этот код больше не работает в Windows 8 с выключенным UAC, потому что он отлично работает в Windows 7 (с выключенным UAC). – Alex

+0

Как именно вы отключите UAC в Windows 8? Если UAC полностью отключен, приложения метро не будут работать должным образом. Если я правильно помню, использование пользовательского интерфейса панели управления не полностью отключает UAC. Приложения все еще работают без полного токена администратора. Почему вы не можете просто добавить манифест в свое приложение, которое указывает, что вам требуется повышение, как и все остальные? –

ответ

3

Я не знаю, почему вы хотите, чтобы выдавать себя за пользователя, чтобы проверить членство в группе. Я думаю, что следующий будет работать с UAC включен или выключен:

Public Shared Function IsLocalAdmin(ByVal userName As String) As Boolean 
    Dim MyIdentity = New System.Security.Principal.WindowsIdentity(userName) 
    Dim MyPrincipal = New System.Security.Principal.WindowsPrincipal(MyIdentity) 
    Return MyPrincipal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator) 
End Function 

Это не должно быть предварительным условием вашей программы, чтобы включить UAC выключить.

+0

О, черт возьми, хороший звонок. Я пропустил ту часть, где он сказал, что он только хотел * проверить *, если пользователь был администратором. Но я бы назвал эту функцию чем-то вроде 'HasAdminPrivileges', потому что если UAC включен, а процесс * не * повышен, это все равно вернет' False', даже если пользователь в противном случае является администратором. –

+0

@CodyGray - я попробовал это на своей (Windows 7) машине с UAC без запуска повышенной и вернул True для моего имени пользователя. Однако я не могу протестировать Windows 8. –

+0

+1 - Это не должно быть предпосылкой вашей программы, чтобы выключить UAC. –