2014-01-07 4 views
1

Я пытаюсь открыть/выполнить другую программу через службу Windows с использованием кода на основе python. При запуске службы Windows будет запущена другая программа, например «Блокнот». Код хорош без ошибок, но он не открывает программу. Код приведен ниже.открытие другой программы через службу windows с использованием python

Код:

import win32serviceutil 
import win32service 
import win32event 
import win32com.shell.shell as w32shell 
import os 
import sys 
import win32process as process 

class SmallestPythonService(win32serviceutil.ServiceFramework): 
    _svc_name_ = "BSmallestPythonService" 
    _svc_display_name_ = "BSmallest possible Python Service" 
def __init__(self, args): 
    win32serviceutil.ServiceFramework.__init__(self, args) 
    # Create an event which we will use to wait on. 
    # The "service stop" request will set this event. 
    self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) 


def SvcStop(self): 
    # Before we do anything, tell the SCM we are starting the stop process. 
    self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
    # And set my event. 
    win32event.SetEvent(self.hWaitStop) 

def SvcDoRun(self): 
    win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 
    import subprocess 
    cmd = "notepad.exe" 
    process = subprocess.Popen(cmd, stdout=subprocess.PIPE, creationflags=0x08000000) 
    process.wait() 

if __name__=='__main__': 
    win32serviceutil.HandleCommandLine(SmallestPythonService) 

В методе SvcDoRun я попытался следующий код, но не успех:

import subprocess 
subprocess.Popen('calc.exe', shell=False) 

также пытались, но не успех:

import subprocess 
subprocess.call('notepad.exe', shell=False) 

также пытался, но не успел:

import win32api 
win32api.WinExec('NOTEPAD.exe') # Works seamlessly 

Мне ничего не хватает? или я делаю это неправильно! Пожалуйста, помогите

ответ

3

Службы Windows работают в сеансе 0, а интерактивные программы запускаются в другом сеансе. Обычно это будет сеанс 1, когда есть один зарегистрированный пользователь. Теперь ваш код будет создавать процессы в сеансе 0, так как он запускается в сеансе 0. И поэтому интерактивный рабочий стол пользователя в сеансе 1 не может взаимодействовать с этими процессами.

можно запустить процесс прогона в другом сеансе от родительского процесса, но это совсем не просто: http://blogs.msdn.com/b/winsdk/archive/2009/07/14/launching-an-interactive-process-from-windows-service-in-windows-vista-and-later.aspx

Один из возможных способов для Вас, чтобы запустить фоновый процесс, который запускается при каждый пользователь входит в систему. Служба может связываться с фоновым процессом с использованием IPC и просить фоновый процесс выполнять работу с ногами для запуска процесса на интерактивном рабочем столе.

Смежные вопросы