1

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

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

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

ここでの問題は何ですか?

編集:いくつかの追加情報。現在のユーザー名を呼び出すサービスとして実行すると、「SYSTEM」が返されます。技術的には現在のユーザーがいないため、システムの観点からHKCUは「存在」しないと思います。その時点でログインしているユーザーがいますが、実行中のスクリプトのスコープにはありません。HKLMのどこかに、現在ログオンしているユーザーを見つけることができたのではないでしょうか。

4

3 に答える 3

0

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

Set WSHNetwork = CreateObject("WScript.Network")    
strUSERID = UCase(WSHNetwork.UserName)
于 2010-02-05T19:13:02.157 に答える
0

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

Windowsは複数のユーザーをログオンさせることができるため、「消費者レベル」バージョンでも(ユーザーの高速切り替えのおかげで)、私が知る限り、「現在の」ユーザーが誰であるかを確実に判断する方法はありません。インストーラーサービスの呼び出し方法に応じて、サービスに登録するユーザーごとに(つまり、[スタート]メニューの[スタートアッププログラム]で)スタートアップ時に実行されるプロセスを試して、現在ログオンしている名前を通知することができます。ユーザーはです。このプロセスは、そのユーザーが高速に切り替えられたときにサービスと通信する可能性もあるため、複数のユーザーがマシンにログオンしている場合にも対処できます。

于 2010-02-05T19:19:11.647 に答える
0

レジストリから情報を取得する場合は、HKEY_USERS(.DEFAULTおよび* _Classesを除く)の下のキーをスキャンして、プロファイルがロードされ、ログオンしているユーザーを見つける必要があります。ちなみに、これがSysInternalsPsLoggedOnツールの仕組みです。そのソースコード(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
于 2010-02-07T19:10:40.723 に答える