Vbscript определить, повышен ли UAC - PullRequest
7 голосов
/ 25 октября 2008

Как мой VBScript может определить, работает ли он в контексте повышенных прав UAC? ​​

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

Ответы [ 4 ]

6 голосов
/ 03 ноября 2008

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

WHOAMI, нормальный и повышенный, на Vista http://lh3.ggpht.com/_Svunm47buj0/SQ6ql4iNjPI/AAAAAAAAAeA/iwbcSrAZqRg/whoami%20-%20adminuser%20-%20groups%20-%20cropped.png?imgmax=512

Вы можете видеть, что когда cmd работает с повышенными правами, whoami / groups сообщает о «высоком» уровне обязательной целостности и другом 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
5 голосов
/ 11 ноября 2013

Вот мое более короткое решение:

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

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

4 голосов
/ 25 мая 2010

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

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

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

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

0 голосов
/ 27 мая 2015

немного короче в 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());
...