vbscriptは、UACの昇格されたコンテキストで実行されているかどうかをどのように検出できますか?
ユーザーを検出し、ユーザーがAdministratorsグループ内にあるかどうかを確認するのに問題はありません。ただし、VistaまたはWindows 2008で実行している場合、プロセスの特権が昇格されているかどうかという質問にはまだ答えられません。このステータスを検出するだけでよいことに注意してください。上昇または(エラー..)下降を試みないでください。
vbscriptは、UACの昇格されたコンテキストで実行されているかどうかをどのように検出できますか?
ユーザーを検出し、ユーザーがAdministratorsグループ内にあるかどうかを確認するのに問題はありません。ただし、VistaまたはWindows 2008で実行している場合、プロセスの特権が昇格されているかどうかという質問にはまだ答えられません。このステータスを検出するだけでよいことに注意してください。上昇または(エラー..)下降を試みないでください。
これが私の短い解決策です:
Function IsElevated
IsElevated = CreateObject("WScript.Shell").Run("cmd.exe /c ""whoami /groups|findstr S-1-16-12288""", 0, true) = 0
End function
この関数はスタンドアロンであり、実行時に点滅するコンソール ウィンドウは表示されません。
私が最終的に採用した方法は、Vista と Windows 2008 には whoami.exe ユーティリティがあり、プロセスを所有するユーザーの整合性レベルを検出するという事実に依存します。いくつかのスクリーンショットがここで役に立ちます:
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
私が投稿している解決策は、whoami を利用してこの情報を見つける、いくつかの本番対応の VBScript です。リソース キット バージョンの whoami.exe のコピーをスクリプトの横 (または各マシンの system32 フォルダー) に置くと、XP で動作することができます (XP で利用可能な情報については)。
CSI_IsSession.vbsには、UAC またはスクリプトが実行されている現在のセッションについて知りたいことのほとんどすべてを教えてくれる単一の関数が含まれています。
VBScriptUACKit.vbs (CSI_IsSession.vbs を使用) を使用すると、スクリプト自体を再起動して、スクリプトで UAC を選択的に要求できます。多くの実行シナリオで動作するように設計およびデバッグされています。
どちらのスクリプトにも、コア スクリプト コードの使用方法を示すサンプル コードが含まれています。