WinXP: Abfragen unter welchem User ein bestimmter Service läuft.

  • Wie kann ich überprüfen, unter welchem User ein bestimmter Dienst unter XP läuft?

    Theoretisch ist das im Service.msc Manager hinterlegt, aber auch im Taskmanager kann man sehen unter welchem User ein Prozess gestartet ist.

    Aber wie ich da via Script rankommen könnte, das ist die gute Frage :pinch:

    3 Mal editiert, zuletzt von Surfy (28. August 2012 um 08:07)

  • Das kannst du mit WMIC machen, dazu über AutoIt mit CMD diesen Befehl ausführen:

    Code
    wmic process where name="beispiel.exe" call getowner >%USERPROFILE%\Desktop\ProcessUser.txt

    "Beispiel.exe" ist der Prozess, der abgefragt werden soll, ">%USERPROFILE%\Desktop\ProcessUser.txt" leitet die Ausgabe in eine Datei um. (Pfad evtl angleichen).

    Edit: Ups, du möchtest das ja mit Diensten haben... :cursing:
    Dann sollte es so gehen:

    Code
    wmic service get Caption,StartName >%USERPROFILE%\Desktop\ServiceUser.txt

    Andernfalls sollte diese Google Suche auch hilfreiche Ergebnisse liefern: http://www.google.de/search?q=wmic+service

    -Cyrox

    Einmal editiert, zuletzt von CyRoX (15. August 2012 um 13:26)

  • Da wir keine Hellseher sind und nicht wissen wie du diesen Kommandozeilenaufruf letzten Endes in autoit realisiert hast wirst du wohl deinen fehlerhaften Versuch posten müssen.
    Das obige Beispiel ist selbstverständlich keine gültige Autoit sondern Batch Syntax.

    Ein korrekter aufruf dürfte so ausschaun:

    [autoit]


    consolewrite("Debug: " & '"wmic.exe" service get Caption,StartName >' & @desktopdir & '\ServiceUser.txt' & @crlf)
    run('"wmic.exe" service get Caption,StartName >' & @desktopdir & '\ServiceUser.txt')

    [/autoit]

    Sofern der Pfad für den Desktop Leerzeichen enthält muss dieser evtl auch noch in Anführungszeichen gesetzt werden, das selbe gild evtl. für den Servicenamen. Am einfachsten testest du den String den ich zum Debuggen in die Scite Console schreibe zuerst von hand in der Eingabeaufforderung von Windows. Dann siehst du auch die Fehlermeldungen die dir die wmic.exe bei falscher Syntax ausgibt.

  • Probiere es mal damit:

    Spoiler anzeigen
    [autoit]


    ;coded by UEZ 2012
    Global $oErrorHandler = ObjEvent("AutoIt.Error", "ObjErrorHandler")

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

    $host = "localhost"
    MsgBox(0, "test", WMI_GetServiceStarterName($host, "Application Layer Gateway Service"))

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

    Func WMI_GetServiceStarterName($sHost, $sService, $sUsr = "", $sPass = "") ;coded by UEZ 2012
    Local $ping = Ping($sHost, 500)
    If @error Then SetError(1, 0, -1)
    Local $objWMILocator = ObjCreate("WbemScripting.SWbemLocator")
    If @error Then Return SetError(2, 0, 0)
    Local $objWMIService = $objWMILocator.ConnectServer($sHost, "\root\cimv2", $sUsr, $sPass, "", "", 128)
    If @error Then Return SetError(3, 0, 0)
    ;~ Local $objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & $sHost & "\root\cimv2")
    Local $colItems = $objWMIService.ExecQuery("SELECT Caption,Name, StartName FROM Win32_Service WHERE Caption LIKE '%" & $sService & "%'", "WQL", 0x30)
    Local $sString
    If IsObj($colItems) Then
    For $objItem In $colItems
    $sString &= $objItem.Caption & " (" &$objItem.Name & ") : " & $objItem.StartName & ";"
    Next
    Return StringTrimRight($sString, 1)
    EndIf
    Return SetError(4, 0, 0)
    EndFunc

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

    Func ObjErrorHandler()
    ConsoleWrite( "A COM Error has occured!" & @CRLF & @CRLF & _
    "err.description is: " & @TAB & $oErrorHandler.description & @CRLF & _
    "err.windescription:" & @TAB & $oErrorHandler & @CRLF & _
    "err.number is: " & @TAB & Hex($oErrorHandler.number, 8) & @CRLF & _
    "err.lastdllerror is: " & @TAB & $oErrorHandler.lastdllerror & @CRLF & _
    "err.scriptline is: " & @TAB & $oErrorHandler.scriptline & @CRLF & _
    "err.source is: " & @TAB & $oErrorHandler.source & @CRLF & _
    "err.helpfile is: " & @TAB & $oErrorHandler.helpfile & @CRLF & _
    "err.helpcontext is: " & @TAB & $oErrorHandler.helpcontext & @CRLF _
    )
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (17. August 2012 um 14:16)

  • Danke UEZ, funktioniert prima! :thumbup: Ich hab sooolang gepröbelt :wacko:

    @ Misterspeed: ich hatte die Zeilen erstmal in der DosEingabe Aufforderung ausprobieren wollen, und bin schon da gescheitert,

  • Funktioniert bei mir einwandfrei, wie gewünscht landet eine Textdatei mit allen Diensten und deren zugeordneten Usern auf dem Desktop. Allerdings ist für die Datei Umleitung des Outputs in Autoit diese Variante notwendig:

    [autoit]


    run(@ComSpec & " /c " & '"wmic.exe" service get Caption,StartName >' & @desktopdir & '\ServiceUser.txt')

    [/autoit]

    Aber auch egal, die Lösung von UEZ ist ohnehin besser. ;)

  • Leider muss ich den Thread nochmals beleben.

    Ein Software Hersteller kam auf die grandiose Idee, den Service mit Sonderzeichen ähnlich "ServiceName.[TET]" zu benennen.

    Und diese Bennenung führt dazu, das das Beispiel von UAZ eine leere Messagebox zurückgibt. Weiss jemand auch dazu ein Hilfsmittel?

    Die Zeile von Misterspeed funktioniert hier, nach einer kleinen Anpassung:

    [autoit]

    RunWait(@ComSpec & " /c " & 'wmic service get Caption,StartName > ' & @TempDir & '\ServiceUser.txt')

    [/autoit]

    Allerdings würde mir die Lösung von UAZ, ohne Umweg um ein externes File, besser gefallen.

    Danke euch,

    Surfy

    Einmal editiert, zuletzt von Surfy (27. August 2012 um 15:42)

  • Da der String mit like ausgeführt wird, was passiert, wenn du nur "ServiceName." eingibst?

    Gruß,
    UAZ UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯