Вопрос

Как мой vbscript может определить, запущен ли он в контексте с повышенными правами UAC?

У меня нет проблем с обнаружением пользователя и проверкой, входит ли он в группу администраторов.Но это все еще не дает ответа на вопрос о том, имеет ли процесс повышенные привилегии или нет, при запуске под управлением Vista или Windows 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

Другие советы

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

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

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

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

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

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

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

немного короче в 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());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top