Vbscript обнаруживают, поднятый ли до контроля учётных записей

путем кодирования строки решит проблему

if sqlite3_bind_text(stmt, 2, (monthen as NSString).utf8String, -1, nil) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("failure binding name: \(errmsg)")

            return
        }
7
задан ThinkingStiff 30 June 2012 в 05:23
поделиться

2 ответа

Метод, на котором я наконец обосновался, зависит от того, что 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 / группы, сообщает о "Высоком" обязательном уровне целостности и другом SID чем тогда, когда неподнятое выполнение. В рис. лучшая сессия нормальна, одна нижняя часть работает поднятый за подсказкой контроля учётных записей.

Зная это, вот код, который я использовал. Это по существу проверяет версию ОС, и если это - Vista или Сервер 2008, CheckforElevation вызовов, который выполняет whoami.exe / группы, и ищет строку 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
6
ответ дан 6 December 2019 в 14:11
поделиться

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

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

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

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

4
ответ дан 6 December 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: