我正在开发一个在自定义安装实用程序下运行的脚本,该实用程序作为服务运行。要获取当前用户名,脚本将执行以下命令:
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的某处我可以找到当前登录的用户?
答案 0 :(得分:0)
Hrm,我想知道对于当前登录的用户是否可以使用Windows Scripting Host命令。我认为即使从服务帐户调用也行。
Set WSHNetwork = CreateObject("WScript.Network")
strUSERID = UCase(WSHNetwork.UserName)
答案 1 :(得分:0)
如果您的进程作为服务运行,如“LOCAL SYSTEM”,那么它确实将返回“SYSTEM”作为当前用户。注册表项开头的HKCU表示HKEY_CURRENT_USER,它将是“SYSTEM”。
由于Windows可以有多个用户登录,即使在“消费者级别”版本上(由于快速用户切换),据我所知,还没有可靠的方法来确定“当前”用户是谁。根据安装程序服务的调用方式,您可以尝试使用在启动时为每个用户运行的进程(即在“开始”菜单中的“启动”程序中),该服务向服务注册,以告诉它当前登录的名称是什么用户是。当用户快速用户切换时,此过程可能还可以与服务进行通信,因此它还可以处理多个用户登录到计算机的情况。
答案 2 :(得分:0)
如果您决定从注册表获取信息,则必须扫描HKEY_USERS下的键( .DEFAULT 和 * _ Classes 除外)以查找加载了配置文件并由此登录的用户。顺便说一下,这就是SysInternals PsLoggedOn工具的工作方式;您可以查看其源代码(Archive.org has it)以获得想法。
或者,如果您可以使用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