Angemeldeten Benutzer ermitteln (vom System-Konto)

  • Also ich habe ein Startskript, dass von einem domain-controller ausgeführt wird, also noch bevor ein Benutzer sich anmeldet.
    Das Skript wird entsprechend mit dem System-Account ausgeführt. Aufgrund der UAC geht das leider nicht anders da das Skript Adminrechte benötigt.

    Es wartet bis die explorer.exe gestartet wurde. Dann soll es ermitteln welcher benutzer angemeldet ist.
    @Username liefert nur "SYSTEM" zurück.
    RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer", "Logon User Name") liefert "", also leerer String.

    Hat noch jemand eine Idee wie man den angemeldeten Benutzer herausbekommt?

    Als möglichkeit würde mir noch einfallen, den Benutzernamen ermitteln, der dem Prozess explorer.exe zugewiesen ist.
    Weiß aber leider nicht wie das geht

    Einmal editiert, zuletzt von Bitboy (14. Januar 2010 um 11:16)

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    #include <array.au3>; Only for _ArrayDisplay()

    [/autoit] [autoit][/autoit] [autoit]

    $avProcProps = _ProcessListProperties()
    _ArrayDisplay($avProcProps, "$avProcProps")

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name: _ProcessListProperties()
    ; Description: Get various properties of a process, or all processes
    ; Call With: _ProcessListProperties( [$Process [, $sComputer]] )
    ; Parameter(s): (optional) $Process - PID or name of a process, default is all
    ; (optional) $sComputer - remote computer to get list from, default is local
    ; Requirement(s): AutoIt v3.2.4.9+
    ; Return Value(s): On Success - Returns a 2D array of processes, as in ProcessList()
    ; with additional columns added:
    ; [0][0] - Number of processes listed (can be 0 if no matches found)
    ; [1][0] - 1st process name
    ; [1][1] - 1st process PID
    ; [1][2] - 1st process Parent PID
    ; [1][3] - 1st process owner
    ; [1][4] - 1st process priority (0 = low, 31 = high)
    ; [1][5] - 1st process executable path
    ; [1][6] - 1st process CPU usage
    ; [1][7] - 1st process memory usage
    ; [1][8] - 1st process creation date/time = "MM/DD/YYY hh:mm:ss" (hh = 00 to 23)
    ; ...
    ; [n][0] thru [n][8] - last process properties
    ; On Failure: Returns array with [0][0] = 0 and sets @Error to non-zero (see code below)
    ; Author(s): PsaltyDS at http://www.autoitscript.com/forum
    ; Date/Version: 05/05/2008 -- v1.0.0
    ; Notes: If a numeric PID or string process name is provided and no match is found,
    ; then [0][0] = 0 and @error = 0 (not treated as an error, same as ProcessList)
    ; This function requires admin permissions to the target computer.
    ; All properties come from the Win32_Process class in WMI.
    ;===============================================================================
    Func _ProcessListProperties($Process = "", $sComputer = ".")
    Local $sUserName, $sMsg, $sUserDomain, $avProcs
    If $Process = "" Then
    $avProcs = ProcessList()
    Else
    $avProcs = ProcessList($Process)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Return for no matches
    If $avProcs[0][0] = 0 Then Return $avProcs

    [/autoit] [autoit][/autoit] [autoit]

    ; ReDim array for additional property columns
    ReDim $avProcs[$avProcs[0][0] + 1][9]

    [/autoit] [autoit][/autoit] [autoit]

    ; Connect to WMI and get process objects
    $oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $sComputer & "\root\cimv2")
    If IsObj($oWMI) Then
    ; Get collection of all processes from Win32_Process
    $colProcs = $oWMI.ExecQuery("select * from win32_process")
    If IsObj($colProcs) Then
    ; For each process...
    For $oProc In $colProcs
    $sObjName = ObjName($oProc, 1)
    If @error Then ContinueLoop; Skip if process no longer exists
    ; Find it in the array
    For $n = 1 To $avProcs[0][0]
    If $avProcs[$n][1] = $oProc.ProcessId Then

    [/autoit] [autoit][/autoit] [autoit]

    ; [n][2] = Parent PID
    $avProcs[$n][2] = $oProc.ParentProcessId
    ; [n][3] = Owner
    If $oProc.GetOwner($sUserName, $sUserDomain) = 0 Then $avProcs[$n][3] = $sUserDomain & "\" & $sUserName
    ; [n][4] = Priority
    $avProcs[$n][4] = $oProc.Priority
    ; [n][5] = Executable path
    $avProcs[$n][5] = $oProc.ExecutablePath
    ; [n][8] = Creation date/time
    Local $dtmDate = $oProc.CreationDate
    If $dtmDate <> "" Then
    $dtmDate = StringMid($dtmDate, 5, 2) & "/" & _
    StringMid($dtmDate, 7, 2) & "/" & _
    StringLeft($dtmDate, 4) & " " & _
    StringMid($dtmDate, 9, 2) & ":" & _
    StringMid($dtmDate, 11, 2) & ":" & _
    StringMid($dtmDate, 13, 2)
    EndIf
    $avProcs[$n][8] = $dtmDate

    [/autoit] [autoit][/autoit] [autoit]

    ExitLoop
    EndIf
    Next
    Next
    Else
    SetError(2); Error getting process collection from WMI
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Get collection of all processes from Win32_PerfFormattedData_PerfProc_Process
    ; Have to use an SWbemRefresher to pull the collection, or all Perf data will be zeros
    Local $oRefresher = ObjCreate("WbemScripting.SWbemRefresher")
    $colProcs = $oRefresher.AddEnum($oWMI, "Win32_PerfFormattedData_PerfProc_Process" ).objectSet
    $oRefresher.Refresh

    [/autoit] [autoit][/autoit] [autoit]

    ; Time delay before calling refresher
    Local $iTime = TimerInit()
    Do
    Sleep(10)
    Until TimerDiff($iTime) > 100
    $oRefresher.Refresh

    [/autoit] [autoit][/autoit] [autoit]

    ; Get PerfProc data
    For $oProc In $colProcs
    ; Find it in the array
    For $n = 1 To $avProcs[0][0]
    If $avProcs[$n][1] = $oProc.IDProcess Then
    ; [n][6] = CPU usage
    $avProcs[$n][6] = $oProc.PercentProcessorTime
    ; [n][7] = memory usage
    $avProcs[$n][7] = $oProc.WorkingSet
    ExitLoop
    EndIf
    Next
    Next
    Else
    SetError(1); Error connecting to WMI
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Return array
    Return $avProcs
    EndFunc ;==>_ProcessListProperties

    [/autoit]
    Spoiler anzeigen
    [autoit]

    $sLoggedInUser = ""
    $sLoggedInDomain = ""
    $sResults = ""
    $strComputer = "."
    $objWMIService = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
    If IsObj($objWMIService) Then
    $colComputer = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")

    [/autoit] [autoit][/autoit] [autoit]

    For $objComputer In $colComputer
    $sLoggedInUser = $objComputer.UserName
    Next
    If StringInStr($sLoggedInUser,"\") Then
    $iSplit = StringInStr($sLoggedInUser,"\")
    $sLoggedInDomain = StringTrimRight($sLoggedInUser,(StringLen($sLoggedInUser) - $iSplit)+1)
    $sLoggedInUser = StringTrimLeft($sLoggedInUser,$iSplit)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $sLoggedInDomain <> "" Then $sResults &= "Logged in domain: " &$sLoggedInDomain &@CRLF
    If $sLoggedInUser <> "" Then $sResults &= "Logged in user: " &$sLoggedInUser & @CRLF
    $sResults &= "@UserName value: " &@UserName &@CRLF
    ConsoleWrite($sResults)
    Else
    ConsoleWrite("Unable to connect to WMI Service" & @CRLF)
    EndIf

    [/autoit]
  • hab die Funktion folgendermaßen umgeschrieben:

    Spoiler anzeigen
    [autoit]

    Func _GetUsername()
    Local $sLoggedInUser = "", $sLoggedInDomain = "", $sResults = ""
    $objWMIService = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\localhost\root\cimv2")
    If IsObj($objWMIService) Then
    $colComputer = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")

    [/autoit] [autoit][/autoit] [autoit]

    For $objComputer In $colComputer
    $sLoggedInUser = $objComputer.UserName
    Next
    If StringInStr($sLoggedInUser,"\") Then
    $iSplit = StringInStr($sLoggedInUser,"\")
    $sLoggedInDomain = StringTrimRight($sLoggedInUser,(StringLen($sLoggedInUser) - $iSplit)+1)
    $sLoggedInUser = StringTrimLeft($sLoggedInUser,$iSplit)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;If $sLoggedInDomain <> "" Then $sResults &= "Logged in domain: " &$sLoggedInDomain &@CRLF
    If $sLoggedInUser = "" Then $sLoggedInUser = "n.a"
    Else
    $sLoggedInUser = "n.a"
    EndIf
    Return $sLoggedInUser
    EndFunc

    [/autoit]

    und es läuft. vielen Dank :)