質問

vbscript が UAC 昇格コンテキストで実行されているかどうかを検出するにはどうすればよいですか?

ユーザーを検出し、そのユーザーが管理者グループ内にあるかどうかを確認するのに問題はありません。しかし、これでは、Vista または Windows 2008 で実行しているときにプロセスの特権が昇格されたかどうかという疑問にはまだ答えていません。注意してください、必要なのは次のことだけです 検出する このステータス。昇格したり、(えーっと ..) 昇格を解除したりしないでください。

役に立ちましたか?

解決

私が最終的に落ち着いた方法は、Vista と Windows 2008 には whoami.exe ユーティリティがあり、プロセスを所有するユーザーの整合性レベルを検出するという事実に依存しています。いくつかのスクリーンショットが役に立ちます。

Vista の WHOAMI (通常および昇格) http://lh3.ggpht.com/_Svunm47buj0/SQ6ql4iNjPI/AAAAAAAAAeA/iwbcSrAZqRg/whoami%20-%20adminuser%20-%20groups%20-%20cropped.png?imgmax=512

cmd が昇格して実行されている場合、whoami /groups は「高」の必須整合性レベルを報告し、非昇格で実行している場合とは異なる SID を報告することがわかります。この図では、上のセッションは通常のセッションであり、下のセッションは UAC プロンプト後に昇格して実行されています。

それを知って、私が使用したコードは次のとおりです。基本的に OS のバージョンをチェックし、Vista または Server 2008 の場合は、whoami.exe /groups を実行する CheckforElevation を呼び出し、出力内で文字列 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 

この関数はスタンドアロンであり、実行時に点滅するコンソールウィンドウを表示しません。

私が投稿している解決策は、whoamiを活用してこの情報を見つける、いくつかのプロダクション対応VBScriptです。スクリプトの横(または各マシンのsystem32フォルダー)にリソースキットバージョンのwhoami.exeのコピーを配置すると、XPで機能すること(XPで利用可能な情報) / p>

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