1

我正在开发一个在自定义安装实用程序下运行的脚本,该实用程序作为服务运行。要获取当前用户名,脚本会执行以下命令:

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 的某个地方我可以找到当前登录的用户?

4

3 回答 3

0

如果您确定要从注册表中获取信息,则必须扫描 HKEY_USERS 下的键(.DEFAULT*_Classes除外)以找出其配置文件已加载并因此登录的用户。顺便说一下,这就是 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
于 2010-02-07T19:10:40.723 回答
0

Hrm,我想知道是否可以为当前登录的用户使用 Windows Scripting Host 命令。我认为即使从服务帐户调用它也会起作用。

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

如果您的进程作为服务运行,如“本地系统”,那么它确实会以当前用户身份返回“系统”。注册表项开头的 HKCU 表示 HKEY_CURRENT_USER,即“SYSTEM”。

由于 Windows 可以有多个用户登录,即使在“消费者级别”版本(感谢快速用户切换)上,据我所知,没有可靠的方法来确定“当前”用户是谁。根据安装程序服务的调用方式,您可以尝试为每个注册该服务的用户(即在“开始”菜单中的“启动程序”中)在启动时运行一个进程,以告诉它当前登录的名称是什么用户是。当该用户被快速用户切换离开时,此过程可能还可以与服务通信,因此它还可以处理多个用户登录到机器的情况。

于 2010-02-05T19:19:11.647 回答