VBScript - サービスとして実行する場合の RegRead に関する問題
-
18-09-2019 - |
質問
サービスとして実行されるカスタム インストール ユーティリティで実行されるスクリプトに取り組んでいます。現在のユーザー名を取得するために、スクリプトは次のコマンドを実行します。
str_Acct_Name_Val = "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Logon User Name"
str_Acct_Name = RegRead(str_Acct_Name_Val)
コマンド プロンプトからスクリプトを実行すると、(管理者アカウントで) その値を問題なく読み取ることができます。サービス/ローカル システム権限を使用して値を読み取ろうとすると、読み取りは失敗します。
ここで何が問題になっているのでしょうか?
編集:いくつかの追加情報。サービスを呼び出すサービスとして実行すると、現在のユーザー名は「SYSTEM」を返します。技術的には現在のユーザーが存在しないため、SYSTEM のビューの下に HKCU は「存在しない」と推測します。この時点でログインしているユーザーはいますが、実行中のスクリプトの範囲内にはありません。おそらく HKLM のどこかに現在ログオンしているユーザーを見つけることができるでしょうか?
解決
レジストリから情報を取得する場合は、HKEY_USERS の下のキーをスキャンする必要があります (ただし、 。デフォルト そして *_クラス) プロファイルがロードされ、ログオンしているユーザーを見つけます。これが SysInternals の仕組みです PsLoggedOn ちなみに、このツールは機能します。ソースコードを見てみましょう (Archive.orgにはそれがあります) アイデアを得るために。
あるいは、WMI を使用できる場合は、ログオンしているユーザーのリストを列挙して取得できます。 Win32_LogonSession
クラスインスタンスと関連するインスタンスの取得 Win32_Account
オブジェクト。このようなもの:
strComputer = "."
Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colSessions = oWMI.ExecQuery _
("SELECT * FROM Win32_LogonSession WHERE LogonType = 2") ' Interactive sessions only
For Each oSession in colSessions
Set colAccounts = oWMI.ExecQuery("ASSOCIATORS OF {Win32_LogonSession.LogonId=" & oSession.LogonId & "} " _
& "WHERE AssocClass=Win32_LoggedOnUser Role=Dependent" )
For Each oAccount in colAccounts
WScript.Echo "Caption: " & oAccount.Caption
WScript.Echo "Domain: " & oAccount.Domain
WScript.Echo "Name: " & oAccount.Name
Next
Next
もあります。 Win32ComputerSystem.UserName
デスクトップが現在アクティブになっているログオン ユーザーの名前を保持するプロパティ:
strComputer = "."
Set oWMI = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = oWMI.ExecQuery("SELECT * FROM Win32_ComputerSystem")
For Each objItem in colItems
Wscript.Echo objItem.UserName
Next
他のヒント
うーん、現在ログインしているユーザーに対して Windows Scripting Host コマンドを使用するとうまくいくでしょうか。サービスアカウントから呼び出しても機能すると思います。
Set WSHNetwork = CreateObject("WScript.Network")
strUSERID = UCase(WSHNetwork.UserName)
プロセスがサービスとして「LOCAL SYSTEM」として実行されている場合、実際には現在のユーザーとして「SYSTEM」が返されます。レジストリ キーの先頭の HKCU は HKEY_CURRENT_USER を意味し、「SYSTEM」になります。
Windows では、(ユーザーの簡易切り替えのおかげで) 「コンシューマー レベル」バージョンであっても、複数のユーザーがログオンできるため、私の知る限り、「現在の」ユーザーが誰であるかを判断する信頼できる方法はありません。インストーラー サービスの呼び出し方法に応じて、各ユーザーの起動時に実行されるプロセスを用意するなどのことを試すことができます (つまり、[スタート] メニューの [スタートアップ プログラム])、サービスに登録して、現在ログオンしているユーザーの名前をサービスに通知します。このプロセスは、ユーザーが高速ユーザー スイッチから離れたときにサービスと通信することもできるため、複数のユーザーがマシンにログオンしている場合も処理できます。