VBScript的问题 - 作为服务运行时的RegRead

时间:2010-02-04 15:09:24

标签: vbscript service registry privileges

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

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 :(得分: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