문제

서비스로 실행중인 사용자 정의 설치 유틸리티에서 실행되는 스크립트를 작업 중입니다. 현재 사용자 이름을 얻으려면 스크립트 가이 명령을 실행합니다.

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

명령 프롬프트에서 스크립트를 실행하면 해당 값을 잘 읽을 수 있습니다 (관리자 계정 아래). 서비스/로컬 시스템 권한으로 값을 읽으려고 시도하면 읽기가 실패합니다.

여기서 문제는 무엇입니까?

편집 : 몇 가지 추가 정보. 현재 사용자 이름을 호출하는 서비스로 실행할 때 "시스템"을 반환하며 기술적으로 현재 사용자가 없기 때문에 HKCU가 시스템의 관점에서 "존재하지 않는다"고 생각합니다. 당시에는 사용자가 로그인했지만 실행중인 스크립트의 범위에는 없습니다. hklm 어딘가에있는 어딘가에있는 어딘가에있는 사용자를 찾을 수 있을까요?

도움이 되었습니까?

해결책

레지스트리에서 정보를 얻기로 결정한 경우 hkey_users 아래에서 키를 스캔해야합니다 (제외 .기본 그리고 *_클래스) 프로필이로드되고 로그온 한 사용자를 찾기 위해. 이것이 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

다른 팁

HRM, 현재 로그인 한 사용자에게 Windows 스크립팅 호스트 명령을 사용하는 것이 작동하는지 궁금합니다. 서비스 계정에서 전화하더라도 효과가 있다고 생각합니다.

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

프로세스가 "로컬 시스템"으로 서비스로 실행되는 경우 실제로 "시스템"을 현재 사용자로 반환합니다. 레지스트리 키의 시작 부분에있는 HKCU는 "시스템"이 될 hkey_current_user를 의미합니다.

"소비자 수준"버전 (빠른 사용자 전환 덕분에)에서도 Windows가 여러 사용자를 로그온 할 수 있으므로, 내가 알고있는 한 "현재"사용자가 누구인지 판단 할 수있는 방법은 없습니다. 설치 관리자 서비스가 어떻게 호출되는지에 따라, 현재 로그인 한 현재 로그인 한 이름을 알리기 위해 각 사용자를 위해 시작하는 프로세스 (즉, 시작 메뉴의 시작 프로그램)와 같은 것을 시도 할 수 있습니다. 사용자입니다. 이 프로세스는 사용자가 빠른 사용자가 빠르게 전환 할 때 서비스에 통신 할 수 있으므로 둘 이상의 사용자가 컴퓨터에 로그인 한 경우를 처리 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top