0

電話したいだけ

Process.Start("notepad.exe");

サービス開始時 しかし、それはまったく機能しません。Windows サービス マネージャーでサービスの開始を選択した直後に、メモ帳が呼び出されません。

本当にありがとうございました。

[更新]

対話型デスクトップを許可するために、ログオンタブにチェックマークを入れて動作させました。しかし、これが本当に何を意味するのかわかりませんか?対話型デスクトップ検出パネルでメッセージを表示することを常に許可するように求められる場合、任意のコンピューターでタスクを実行するようにスケジュールするにはどうすればよいですか?

4

1 に答える 1

3

Windows サービスは標準プロセスとは異なり、デフォルトではユーザー デスクトップと対話できません (これは Windows OS の規則です)。そのため、プロセスを起動してユーザー デスクトップと対話できるようにするには、フラグを立てる必要があります。デスクトップと対話するオプション...

Windows Vista 以降、サービスはセッション 0 で実行されており、サービスがプロセスを開始しようとするたびに、プロセスを実行するかどうかを選択できるパネルがユーザーに表示されることに注意してください。この制限 (確認を求めるパネル) を克服する唯一の方法は、Windows APIのCreateProcessAsUser関数を使用して、サービスからプロセスを直接起動することです ...

CreateProcessAsUser API を使用して、Vista/7 でも何も要求せずにサービスからプロセスを開始する、私が以前に開発したこの関数を見てください。

    /// <summary>
    /// LaunchProcess As User Overloaded for Window Mode 
    /// </summary>
    /// <param name="cmdLine"></param>
    /// <param name="token"></param>
    /// <param name="envBlock"></param>
    /// <param name="WindowMode"></param>
    /// <returns></returns>
    private static bool LaunchProcessAsUser(string cmdLine, IntPtr token, IntPtr envBlock,uint WindowMode)
    {
        bool result = false;

        PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
        SECURITY_ATTRIBUTES saProcess = new SECURITY_ATTRIBUTES();
        SECURITY_ATTRIBUTES saThread = new SECURITY_ATTRIBUTES();
        saProcess.nLength = (uint)Marshal.SizeOf(saProcess);
        saThread.nLength = (uint)Marshal.SizeOf(saThread);

        STARTUPINFO si = new STARTUPINFO();
        si.cb = (uint)Marshal.SizeOf(si);

        //if this member is NULL, the new process inherits the desktop
        //and window station of its parent process. If this member is
        //an empty string, the process does not inherit the desktop and
        //window station of its parent process; instead, the system
        //determines if a new desktop and window station need to be created.
        //If the impersonated user already has a desktop, the system uses the
        //existing desktop.

        si.lpDesktop = @"WinSta0\Default"; //Default Vista/7 Desktop Session
        si.dwFlags = STARTF_USESHOWWINDOW | STARTF_FORCEONFEEDBACK;

        //Check the Startup Mode of the Process 
        if (WindowMode == 1)
            si.wShowWindow = SW_SHOW;
        else if (WindowMode == 2)
        { //Do Nothing
        }
        else if (WindowMode == 3)
            si.wShowWindow = 0; //Hide Window 
        else if (WindowMode == 4)
            si.wShowWindow = 3; //Maximize Window
        else if (WindowMode == 5)
            si.wShowWindow = 6; //Minimize Window
        else
            si.wShowWindow = SW_SHOW;


        //Set other si properties as required.
        result = CreateProcessAsUser(
        token,
        null,
        cmdLine,
        ref saProcess,
        ref saThread,
        false,
        CREATE_UNICODE_ENVIRONMENT,
        envBlock,
        null,
        ref si,
        out pi);

        if (result == false)
        {
            int error = Marshal.GetLastWin32Error();
            string message = String.Format("CreateProcessAsUser Error: {0}", error);
            Debug.WriteLine(message);

        }

        return result;
    }
于 2012-07-08T14:54:33.937 に答える