Trouble killing a process on windows - Python

This is a discussion on Trouble killing a process on windows - Python ; Hi, I'd like to start a program, run it for a while, then terminate it. I can do this on linux, but I'm new to working with windows. Here's my script: from subprocess import Popen from time import sleep import ...

+ Reply to Thread
Results 1 to 5 of 5

Trouble killing a process on windows

  1. Default Trouble killing a process on windows

    Hi, I'd like to start a program, run it for a while, then terminate
    it. I can do this on linux, but I'm new to working with windows.
    Here's my script:

    from subprocess import Popen
    from time import sleep
    import win32api
    war3game = Popen(["C:\Program Files\Warcraft III\Frozen Throne.exe"])
    sleep(30)
    print "slept for 30"
    print win32api.TerminateProcess(int(war3game._handle),-1)
    #print
    ctypes.windll.kernel32.TerminateProcess(int(war3game._handle),-1)
    print "terminated process"

    Here's the output:
    slept for 30
    Traceback (most recent call last):
    File "C:\Python24\warcraft\runwar3.py", line 7, in ?
    print win32api.TerminateProcess(int(war3game._handle),-1)
    error: (5, 'TerminateProcess', 'Access is denied.')

    I'm logged in as adminstrator. Does anyone know how to fix this
    problem?
    Thanks for your time,
    Tom


  2. Default Re: Trouble killing a process on windows

    Thomas Nelson wrote:

    > from subprocess import Popen
    > from time import sleep
    > import win32api
    > war3game = Popen(["C:\Program Files\Warcraft III\Frozen Throne.exe"])
    > sleep(30)
    > print "slept for 30"
    > print win32api.TerminateProcess(int(war3game._handle),-1)
    > #print
    > ctypes.windll.kernel32.TerminateProcess(int(war3game._handle),-1)
    > print "terminated process"
    >
    > Here's the output:
    > slept for 30
    > Traceback (most recent call last):
    > File "C:\Python24\warcraft\runwar3.py", line 7, in ?
    > print win32api.TerminateProcess(int(war3game._handle),-1)
    > error: (5, 'TerminateProcess', 'Access is denied.')
    >
    > I'm logged in as adminstrator. Does anyone know how to fix this
    > problem?


    There's nothing obvious. I assume you got your info
    from here?

    http://aspn.activestate.com/ASPN/Coo.../Recipe/347462

    Just for completeness, have you tried the pid-based technique
    shown there? I've no idea why it should work if this one
    doesn't but... (I have a slight suspicion that the fact that
    it opens the process with a "for-termination" flag might help).

    Failing that, you can see if WMI can do it (although I assume
    that, under the covers, WMI just calls TerminateProcess):

    http://timgolden.me.uk/python/wmi_co...estroy_notepad

    I suppose you might have to adjust your token privs to include,
    say the Debug priv. This is designed to let you take control
    of any process (and terminate it, or whatever). If it looks
    like you need to do that, post back and I -- or someone else --
    can try to run up an example.

    TJG

  3. Default Re: Trouble killing a process on windows

    On Jun 2, 12:27 pm, Thomas Nelson <t...@mail.utexas.edu> wrote:
    > Hi, I'd like to start a program, run it for a while, then terminate
    > it. I can do this on linux, but I'm new to working with windows.
    > Here's my script:
    >
    > from subprocess import Popen
    > from time import sleep
    > import win32api
    > war3game = Popen(["C:\Program Files\Warcraft III\Frozen Throne.exe"])
    > sleep(30)
    > print "slept for 30"
    > print win32api.TerminateProcess(int(war3game._handle),-1)
    > #print
    > ctypes.windll.kernel32.TerminateProcess(int(war3game._handle),-1)
    > print "terminated process"
    >
    > Here's the output:
    > slept for 30
    > Traceback (most recent call last):
    > File "C:\Python24\warcraft\runwar3.py", line 7, in ?
    > print win32api.TerminateProcess(int(war3game._handle),-1)
    > error: (5, 'TerminateProcess', 'Access is denied.')
    >
    > I'm logged in as adminstrator. Does anyone know how to fix this
    > problem?
    > Thanks for your time,
    > Tom


    kill = Popen(['taskkill', war3game.pid])

    *shrugs*

    maybe it is just taskill, or maybe you need the full path.
    don't recall as I quit using windows.

    Takskill on XP and newer maybe


  4. Default Re: Trouble killing a process on windows

    On Jun 2, 11:43 am, Tim Golden <m...@timgolden.me.uk> wrote:
    > Thomas Nelson wrote:
    > > from subprocess import Popen
    > > from time import sleep
    > > import win32api
    > > war3game = Popen(["C:\Program Files\Warcraft III\Frozen Throne.exe"])
    > > sleep(30)
    > > print "slept for 30"
    > > print win32api.TerminateProcess(int(war3game._handle),-1)
    > > #print
    > > ctypes.windll.kernel32.TerminateProcess(int(war3game._handle),-1)
    > > print "terminated process"

    >
    > > Here's the output:
    > > slept for 30
    > > Traceback (most recent call last):
    > > File "C:\Python24\warcraft\runwar3.py", line 7, in ?
    > > print win32api.TerminateProcess(int(war3game._handle),-1)
    > > error: (5, 'TerminateProcess', 'Access is denied.')

    >
    > > I'm logged in as adminstrator. Does anyone know how to fix this
    > > problem?

    >
    > There's nothing obvious. I assume you got your info
    > from here?
    >
    > http://aspn.activestate.com/ASPN/Coo.../Recipe/347462
    >
    > Just for completeness, have you tried the pid-based technique
    > shown there? I've no idea why it should work if this one
    > doesn't but... (I have a slight suspicion that the fact that
    > it opens the process with a "for-termination" flag might help).
    >
    > Failing that, you can see if WMI can do it (although I assume
    > that, under the covers, WMI just calls TerminateProcess):
    >
    > http://timgolden.me.uk/python/wmi_co...estroy_notepad
    >
    > I suppose you might have to adjust your token privs to include,
    > say the Debug priv. This is designed to let you take control
    > of any process (and terminate it, or whatever). If it looks
    > like you need to do that, post back and I -- or someone else --
    > can try to run up an example.
    >
    > TJG


    I Tried the PID method, and the Taskkill method, and neither worked.
    This is what I get for trying to work on a windows machine. If you
    could explain how to add the debug privilege, that would be great.
    Just out of curiosity, is there a reason a python module like os
    couldn't have a universal terminateProcess type function, that works
    on all systems? Something like os.listdir seems to work really well
    everywhere. Maybe killing processes is too complicated for this?

    Thanks for the help,
    Tom


  5. Default Re: Trouble killing a process on windows

    Thomas Nelson wrote:

    [... re Access Denied error on trying to TerminateProcess ...]

    [Tim Golden]
    >> I suppose you might have to adjust your token privs to include,
    >> say the Debug priv. This is designed to let you take control
    >> of any process (and terminate it, or whatever). If it looks
    >> like you need to do that, post back and I -- or someone else --
    >> can try to run up an example.


    [Thomas Nelson]
    > I Tried the PID method, and the Taskkill method, and neither worked.
    > This is what I get for trying to work on a windows machine. If you
    > could explain how to add the debug privilege, that would be great.


    OK, this being Windows security, there's a couple
    of hoops to jump through, but nothing too bad.

    <code>
    import win32api
    import win32security as sec

    #
    # This function is merely window-dressing
    # to make it easier to see whether the
    # code has worked or not.
    #
    def priv_status (hToken, priv):
    for p, status in sec.GetTokenInformation (
    hToken,
    sec.TokenPrivileges
    ):
    if p == priv:
    if status == 0:
    return "disabled"
    else:
    return "enabled"
    else:
    return "disabled"

    process = win32api.GetCurrentProcess ()
    token_access_flags = sec.TOKEN_ADJUST_PRIVILEGES | sec.TOKEN_QUERY
    hToken = sec.OpenProcessToken (process, token_access_flags)
    debug_priv = sec.LookupPrivilegeValue (None, sec.SE_DEBUG_NAME)

    print "Debug is", priv_status (hToken, debug_priv)

    privs = [(debug_priv, sec.SE_PRIVILEGE_ENABLED)]
    sec.AdjustTokenPrivileges (hToken, 0, privs)

    print "Debug is", priv_status (hToken, debug_priv)

    </code>

    > Just out of curiosity, is there a reason a python module like os
    > couldn't have a universal terminateProcess type function, that works
    > on all systems? Something like os.listdir seems to work really well
    > everywhere. Maybe killing processes is too complicated for this?


    Not to say that there could never be one, but I suspect
    that the difference of APis and the number of corner
    cases makes it a daunting task for maintenance. The
    code would have to work on every platform Python works
    on -- which is no small number -- and would have to be
    maintained across the many and varied changes on each
    of those platforms.

    Still, if you think you're in with a chance, go ahead
    and offer

    Let us know if the DEBUG priv thing works or not.

    TJG

+ Reply to Thread

Similar Threads

  1. Killing Child Async Process (Non-Webservice)
    By Application Development in forum CSharp
    Replies: 1
    Last Post: 11-09-2007, 07:40 PM
  2. [Fwd: Re: Trouble killing a process on windows]
    By Application Development in forum Python
    Replies: 0
    Last Post: 06-02-2007, 11:53 AM
  3. Killing a process while in a TransactionScope
    By Application Development in forum DOTNET
    Replies: 3
    Last Post: 04-04-2007, 04:33 AM
  4. Replies: 1
    Last Post: 04-17-2006, 04:11 PM
  5. Killing a process on error
    By Application Development in forum Clarion
    Replies: 2
    Last Post: 07-15-2004, 07:13 AM