1


0

VBScriptの問題-サービスとして実行する場合のRegRead

サービスとして実行されているカスタムインストールユーティリティで実行されるスクリプトに取り組んでいます。 現在のユーザー名を取得するために、スクリプトは次のコマンドを実行します。

str_Acct_Name_Val = "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Logon User Name"
str_Acct_Name = RegRead(str_Acct_Name_Val)

コマンドプロンプトからスクリプトを実行すると、(管理者アカウントで)その値を問題なく読み取ることができます。 サービス/ローカルシステム権限で値を読み取ろうとすると、読み取りは失敗します。

ここで問題は何ですか?

編集:いくつかの追加情報。 現在のユーザー名を呼び出すサービスとして実行すると「SYSTEM」が返されますが、技術的には現在のユーザーがいないため、HKCUはSYSTEMのビューの下に「存在しない」と推測されます。 その時点でログインしているユーザーがいますが、実行中のスクリプトのスコープ内にはありません。 HKLMのどこかに、現在ログオンしているユーザーが見つかる可能性がありますか?

3 回答


0


Hrm、現在ログインしているユーザーに対してWindows Scripting Hostコマンドを使用するとうまくいくのかしら。 サービスアカウントから呼び出されても機能すると思います。

Set WSHNetwork = CreateObject("WScript.Network")
strUSERID = UCase(WSHNetwork.UserName)


0


プロセスが「LOCAL SYSTEM」としてサービスとして実行されている場合、実際には現在のユーザーとして「SYSTEM」を返します。 レジストリキーの先頭にあるHKCUはHKEY_CURRENT_USERを意味し、「SYSTEM」になります。

Windowsでは、「コンシューマレベル」バージョン(ユーザーの簡易切り替えのおかげ)でも複数のユーザーがログオンできるため、「現在の」ユーザーが誰であるかを確実に判断する方法はありません。 インストーラーサービスの起動方法に応じて、各ユーザーの起動時に実行されるプロセスのようなものを試すことができます(つまり、 [スタート]メニューの[スタートアッププログラム]で)現在ログオンしているユーザーの名前をサービスに登録するように登録します。 このプロセスは、おそらく、ユーザーが高速ユーザーから切り替わったときにサービスと通信できるため、複数のユーザーがマシンにログオンしている場合にも対応できます。


0


レジストリから情報を取得することに決めた場合は、HKEY_USERSの下のキー(.DEFAULT_および * _ Classes_を除く)をスキャンして、プロファイルがロードされ、ログオンしているユーザーを見つける必要があります。 これは、SysInternals PsLoggedOnツールの仕組みです。ソースコード(http://web.archive.org/web/*/http://www.sysinternals.com/files/PsLoggedonSrc.zip[Archive.orgにあります])を見て取得できますアイディア。

または、WMIを使用できる場合は、http://msdn.microsoft.com/en-us/library/aa394189.aspx [Win32_LogonSession]クラスインスタンスを列挙して、ログオンしているユーザーのリストを取得できます。関連するhttp://msdn.microsoft.com/en-us/library/aa394061.aspx [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

また、デスクトップが現在アクティブになっているログオンユーザーの名前を保持するhttp://msdn.microsoft.com/en-us/library/aa394102.aspx [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