2010-02-04 2 views
1

서비스로 실행되는 사용자 지정 설치 유틸리티로 실행되는 스크립트 작업 중입니다. 스크립트가이 명령을 실행하는 현재 사용자 이름 얻으려면 : 내가 명령 프롬프트에서 스크립트를 실행하면서비스로 실행 중일 때 VBScript-RegRead 관련 문제

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

를, 그것은 (관리자 계정으로) 잘 그 값을 읽을 수 있습니다. 값이 서비스/로컬 시스템 권한으로 읽으려고 시도하면 읽기가 실패합니다.

무엇이 문제입니까?

EDIT : 몇 가지 추가 정보가 있습니다. 현재 사용자 이름을 호출하는 서비스로 실행하면 "SYSTEM"이 반환되고 기술적으로 현재 사용자가 없기 때문에 HKCU가 SYSTEM보기 아래에 "존재하지"않는다고 추측 할 수 있습니다. 이 시간에는 로그인 한 사용자가 있지만 실행중인 스크립트의 범위에는 없습니다. 어쩌면 HKLM 어딘가에 현재 로그온 한 사용자를 찾을 수 있습니까?

답변

0

레지스트리에서 정보를 얻을하기로 결정하는 경우 프로필이로드 따라서있는 사용자를 찾아 ( .DEFAULT이 *을 _Classes 제외) HKEY_USERS 아래의 키를 스캔해야합니다 로그인. 이것은 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 
0

님, 현재 로그온 한 사용자에 대해 Windows Scripting Host 명령을 사용하면 작동하는지 궁금합니다. 서비스 계정에서 호출해도 작동한다고 생각합니다.

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

아니, 즉 시스템이 될 것입니다. – Helen

0

"로컬 시스템"으로 프로세스가 실행중인 경우 "SYSTEM"이 현재 사용자로 반환됩니다. 레지스트리 키의 시작 부분에있는 HKCU는 HKEY_CURRENT_USER를 의미하며 "SYSTEM"이됩니다.

Windows는 여러 사용자가 로그온 할 수 있으므로 "사용자 수준"버전 (빠른 사용자 전환 기능 덕택에)에도 "현재"사용자가 누구인지 파악할 수있는 확실한 방법이 없습니다. 설치 프로그램 서비스가 호출되는 방법에 따라 서비스에 등록되어 각 사용자에 대해 현재 실행중인 프로세스의 이름 (예 : 시작 메뉴의 시작 프로그램)을 실행하는 것과 같은 방법을 시도해 볼 수 있습니다 사용자가 이 프로세스는 해당 사용자가 빠른 사용자 전환시 서비스와 통신 할 수 있으므로 둘 이상의 사용자가 시스템에 로그온 한 경우에도 처리 할 수 ​​있습니다.

관련 문제