$oProc.GetOwner

  • Guten Abend zusammen,


    ich habe ein Problem mit einer Funktion, die ich implementieren möchte.

    Über WMI soll die ProcessID, der Processname und der Processowner ausgelesen werden.
    Processname und ProcessID wird zurückgegeben, jedoch für den Owner wird mir der Wert 0 (Null) zurückgegeben.
    Was mache ich falsch?
    Kann mir jemand bei der Lösung helfen?

    Vielen Dank im Voraus.
    Axel

    Hier mein Quellcode:

    [autoit]


    Func MyPID()
    $COMPUTERNAME = EnvGet ("COMPUTERNAME")
    $sUsername=EnvGet ("USERNAME")
    $sUserDomain=EnvGet ("USERDOMAIN")
    Dim $nPID, $nName, $nOwner
    Dim $objItems
    Dim $objWMI

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

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20

    $objWMI = ObjGet("winmgmts:\\" & $COMPUTERNAME & "\root\CIMV2")
    $objItems = $objWMI.ExecQuery('Select * from Win32_Process Where Name = "ALG.exe" Or Name = "' & @ScriptName & '"', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($objItems) Then
    For $objItem In $objItems
    $nPID = $objItem.ProcessId
    $nName = $objItem.Name
    $nOwner = $objItem.GetOwner
    ConsoleWrite("PID: " & $objItem.ProcessId & @CRLF)
    ConsoleWrite("PROCESS: " & $objItem.Name & @CRLF)
    ConsoleWrite("OWNER: " & $nOwner & @CRLF)
    Next
    EndIf
    Return $nPID
    Return $nName
    Return $nOwner
    EndFunc

    [/autoit]

    --
    Mit freundlichen Grüßen,
    Axel Stoppa

    Einmal editiert, zuletzt von MCTAST245 (18. Juni 2009 um 21:03)

  • Moinsen,

    die Null für GetOwner sagt "Successful Completion" ;)

    Spoiler anzeigen
    [autoit]

    ;
    MyPID ( )

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

    Func MyPID ( )

    Local $COMPUTERNAME = EnvGet ("COMPUTERNAME")
    Local $sUsername;=EnvGet ("USERNAME")
    Local $sUserDomain;=EnvGet ("USERDOMAIN")
    Local $nPID, $sName, $nOwner
    Local $objItems
    Local $objWMI

    If ($COMPUTERNAME == "") Then _
    $COMPUTERNAME = "localhost"

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

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20

    $objWMI = ObjGet("winmgmts:\\" & $COMPUTERNAME & "\root\CIMV2")
    $objItems = $objWMI.ExecQuery('Select * from Win32_Process Where Name = "autoit3.exe"', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($objItems) Then
    For $objItem In $objItems
    $nPID = $objItem.ProcessId
    $sName = $objItem.Name
    $nOwner = $objItem.GetOwner ($sUsername, $sUserDomain)
    ConsoleWrite("> PID : " & $nPID & @CRLF)
    ConsoleWrite("> PROCESS : " & $sName & @CRLF)
    If ($nOwner == 0) Then _
    ConsoleWrite("> OWNER / DOMAIN : " & $sUsername & " / " & $sUserDomain & @CRLF)
    Next
    EndIf
    Return $nPID ???
    ;~ Return $sName ???
    ;~ Return $nOwner ???

    EndFunc

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

    Exit (0)

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

    ;

    [/autoit]

    Wenn Du alle Werte zurückgeben möchtest, dann solltest Du ein Array dafür benutzen. ;)

    Spoiler anzeigen
    [autoit]

    ;
    Local $aReturn [4]
    ...
    If IsObj($objItems) Then
    For $objItem In $objItems
    $aReturn[0] = $objItem.ProcessId
    $aReturn[1] = $objItem.Name
    $nOwner = $objItem.GetOwner ($aReturn[2], $aReturn[3])
    Next
    EndIf
    Return $aReturn

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

    ;

    [/autoit]

    Gruß
    Greenhorn


    Einmal editiert, zuletzt von Greenhorn (17. Juni 2009 um 18:58)

  • Hallo Greenhorn,

    vielen Dank für die Info. ^^

    Wo ist der Vorteil wenn ich ein Array erstelle?
    Ausser das es professioneller aussieht. Auch hierfür danke.

    Wo ist der Unterschied zu deiner Abfrage in Zeile 25.
    Deins --> $nOwner = $objItem.GetOwner($sUserName, $sUserDomain)
    Meins --> $nOwner = $objItem.GetOwner

    Bisher dachte ich, das man nur ein ganzes Objekt Item abfragen kann.
    Gehe ich aufgrund deines Scriptes recht in der Annahme, dass man auch einzelne Werte abfragen kann?

    Weisst du zufällig ob man irgendwo eine Referenz dazu findet?
    Im Scriptomatic2 von Microsoft habe ich viel gefunden, allerdings nichts über objItem.GetOwner.

    Habe dein Script gerade ausprobiert.
    That's it :thumbup:

    Sollte ich das den Thread auf gelöst setzen, wenn ich evtl. später noch Fragen dazu habe?

    Danke und schönen Abend.
    Axel aus'm Pott

    --
    Mit freundlichen Grüßen,
    Axel Stoppa

  • Hi,

    Wo ist der Vorteil wenn ich ein Array erstelle?
    Ausser das es professioneller aussieht. Auch hierfür danke.


    Aus deinem Beispielscript habe ich die letzten beiden "Return"s auskommentiert, da das so nicht funktioniert (sollte es deine Absicht gewesen sein nacheinander alle Werte zurückzugeben).
    Wenn Du in AutoIt Return aufrufst wird sofort aus der Funktion zurückgekehrt, das ist in vbs glaube ich anders ... ?(

    In einem Array hast Du alle Werte in einer Variablen und kannst diese dann "Return"en. ;)

    Zitat

    Wo ist der Unterschied zu deiner Abfrage in Zeile 25.
    Deins --> $nOwner = $objItem.GetOwner($sUserName, $sUserDomain)
    Meins --> $nOwner = $objItem.GetOwner


    Nun ganz einfach, ich gebe der Methode GetOwner die benötigten Parameter mit, um die Zeichenketten für "User" und "Domain" zu erhalten.
    GetOwner benötigt zwei Variablen zu je einem Puffer, welche die Zeichenketten aufnehmen.
    GetOwner Methode

    Zitat

    Bisher dachte ich, das man nur ein ganzes Objekt Item abfragen kann.
    Gehe ich aufgrund deines Scriptes recht in der Annahme, dass man auch einzelne Werte abfragen kann?


    Du kannst alle Methoden benutzen, die dir die Klasse Win32_Process zur Verfügung stellt.

    Zitat

    Weisst du zufällig ob man irgendwo eine Referenz dazu findet?
    Im Scriptomatic2 von Microsoft habe ich viel gefunden, allerdings nichts über objItem.GetOwner.


    Windows Management Instrumentation

    Zitat

    Sollte ich das den Thread auf gelöst setzen, wenn ich evtl. später noch Fragen dazu habe?


    Kannst ihn ruhig erst einmal auf gelöst setzen, und solltest Du an diesem Thema anknüpfen wollen, dann kannst Du ihn wieder auf "offen" setzen (glaub ich doch :rolleyes: )

    Zitat

    Danke und schönen Abend.
    Axel aus'm Pott


    Da nicht für, und ich wünsche dir auch noch einen entspannten Abend. :)

    Greenhorn aus'm platten Land


  • Hallo Greenhorn,

    habe zuviel versprochen.
    Wie setze ich den Thread auf gelöst? ;(

    Es ist schon spät und ich habe den ganzen Abend programmiert. :pinch:

    Also Gute Nacht und noch Mal Danke.

    Axel

    --
    Mit freundlichen Grüßen,
    Axel Stoppa