2008-10-25 8 views
6

Как мой vbscript обнаруживает, работает ли он в расширенном контексте UAC?Vbscript обнаруживает, был ли повышен UAC

У меня нет проблем с обнаружением пользователя и выяснением, находится ли пользователь в группе «Администраторы». Но это все еще не отвечает на вопрос о том, был ли процесс поднят приятелями или нет, при работе под Vista или Windows 2008. Обратите внимание: мне нужно только определить этот статус; не пытаться поднять или (ошибочно) де-возвысить.

+0

Heads вверх, намного лучше, чем ответ принятый один был добавлен ниже. – Tomalak 2014-06-27 13:40:50

ответ

5

Метод, который я, наконец, решил, зависит от того, что Vista и Windows 2008 имеют утилиту whoami.exe и обнаруживают уровень целостности пользователя, которому принадлежит этот процесс. Пара скриншотов помочь здесь:

WHOAMI, normal and elevated, on Vista http://lh3.ggpht.com/_Svunm47buj0/SQ6ql4iNjPI/AAAAAAAAAeA/iwbcSrAZqRg/whoami%20-%20adminuser%20-%20groups%20-%20cropped.png?imgmax=512

Вы можете видеть, что, когда ЦМД работает приподнят, Whoami/группы сообщает «Высокий» уровень обязательной целостности и другой SID, чем при работе, не повышено. На рис. Верхний сеанс является нормальным, один под ним работает после запроса UAC.

Зная это, вот код, который я использовал. Он по существу проверяет версию ОС, и если она Vista или Server 2008, вызывает CheckforElevation, которая запускает whoami.exe/groups, и ищет строку S-1-16-12288 в выводе. В этом примере я просто возвращаю статус; в реальном сценарии я перехожу к разным действиям на основе результата.

sub GetOSVersion 
Dim strComputer, oWMIService, colOSInfo, oOSProperty, strCaption, strOSFamily 
strComputer = "." 
Set oWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set colOSInfo = oWMIService.ExecQuery("Select * from Win32_OperatingSystem") 
'I hate looping through just to get one property. But dunno another way! 
For Each oOSProperty in colOSInfo 
    strCaption = oOSProperty.Caption 
Next 
If InStr(1,strCaption, "Vista", vbTextCompare) Then strOSFamily = "Vista" 
If InStr(1,strCaption, "2008", vbTextCompare) Then strOSFamily = "2008" 
If InStr(1,strCaption, "XP", vbTextCompare) Then strOSFamily = "XP" 
If InStr(1,strCaption, "2003", vbTextCompare) Then strOSFamily = "2003" 
If InStr(1,strCaption, "2000", vbTextCompare) Then strOSFamily = "2000" 
If strOSFamily = "" Then 
    Wscript.Echo "No known OS found. (Script can detect Windows 2000, 2003, XP, Vista, 2008.)" 
Else 
    Wscript.Echo "OS Family = " & strOSFamily 
End If 
Select Case strOSFamily 'if Vista/2008 then call CheckforElevation 
Case "Vista" 
    CheckforElevation 
Case "2008" 
    CheckforElevation 
Case Else 
    Exit Sub 
End Select 
end sub 

sub CheckforElevation 'test whether user has elevated token 
Dim oShell, oExecWhoami, oWhoamiOutput, strWhoamiOutput, boolHasElevatedToken 
Set oShell = CreateObject("WScript.Shell") 
Set oExecWhoami = oShell.Exec("whoami /groups") 
Set oWhoamiOutput = oExecWhoami.StdOut 
strWhoamiOutput = oWhoamiOutput.ReadAll 
If InStr(1, strWhoamiOutput, "S-1-16-12288", vbTextCompare) Then boolHasElevatedToken = True 
If boolHasElevatedToken Then 
    Wscript.Echo "Current script is running with elevated privs." 
Else 
    Wscript.Echo "Current script is NOT running with elevated privs." 
End If 
end sub 
+0

Конечно, это отстой. Было бы чище иметь доступ к API GetTokenInformation. Но, видимо, это вне границ для VBscript. Хорошо, мы делаем все возможное. – quux 2008-11-03 07:45:56

4

Решение, которое я публикую, представляет собой пару готовых VBScripts, которые используют whoami для поиска этой информации. Одна из них - это то, что они работают с XP (для информации, доступной на XP), если вы разместите копию версии Resource Kit версии whoami.exe рядом со сценарием (или в папке system32 каждой машины).

CSI_IsSession.vbs содержит одну функцию, которая может рассказать вам почти все, что вы хотите знать о UAC или текущей сессии, в которой работает скрипт.

VBScriptUACKit.vbs (который использует CSI_IsSession.vbs) позволяет выборочно запрашивать UAC в скрипте, перезаписывая себя. Был разработан и отлажен, чтобы работать в соответствии со многими сценариями выполнения.

Оба сценария содержат пример кода, который демонстрирует, как использовать основной код сценария.

+0

Ничего себе, ты действительно исследовал это! Статья в блоге на вашей ссылке CSI_IsSession.vbs заполнена полной информацией; Спасибо за это. Это все еще облом, что vbscript не может сделать это без вызова whoami.exe. – quux 2010-06-05 11:48:03

4

Вот мое решение короче:

Function IsElevated 
    IsElevated = CreateObject("WScript.Shell").Run("cmd.exe /c ""whoami /groups|findstr S-1-16-12288""", 0, true) = 0 
End function 

Эта функция стоять в одиночку, и не будет отображать любые мигающего окно консоли при выполнении.

+1

Отлично, это лучше, чем принятый ответ. – Tomalak 2014-06-27 13:39:56

0

немного короче в WSH Jscript

function isElevated(){ 
    var strCaption = ""; 
    for (var enumItems=new Enumerator(GetObject("winmgmts:\\\\.\\root\\CIMV2").ExecQuery("Select * from Win32_OperatingSystem")); !enumItems.atEnd(); enumItems.moveNext()) { 
     strCaption += enumItems.item().Caption; 
    } 
    if(/Vista|2008|Windows\s7|Windows\s8/.test(strCaption)){ 
     return (new ActiveXObject("WScript.Shell").run('cmd.exe /c "whoami /groups|findstr S-1-16-12288"', 0, true)) == 0; 
    }else{return true} 
}  

WScript.Echo(isElevated());