2016-05-26 9 views
1

Windowsサービスからソフトウェアの更新を実行しようとしています。私のサービスはLocalSystemで動作します。Windowsサービスを使用してプロセスを起動する

APIエラー3(ERR_FILE_NOT_FOUND)で失敗したCreateProcessAsUser行まではすべて正常に動作すると思います。

私は自分のコードをデバッグに行くに方法がわかりませんよ。私はProcMonを使って実際にパスを見つけることができないかどうかを確認しましたが、そうしていたので、他のものを逃した可能性があります。

誰でも可能間違いを見ていますか?

私は、アクティブなセッションを取得するためにWTSEnumerateSessionsを使用しています。何らかの理由で、そのMachineNameメンバーは空ですが、SessionIDない 0であるので、私はそれはまだ大丈夫だと思います。

Public Function StartAppInSessionAsAdmin(ByVal uSessionID As String, ByVal uWinstationNameStrPtr As Long, ByVal uAppName As String) As Integer 

    'get SessionID token 
    Dim hToken& 
    Dim bRet As Boolean 
    bRet = WTSQueryUserToken(uSessionID, hToken) 
    WriteLog "wtsqueryusertoken: " & bRet & ", htoken: " & hToken 

    'we need to get the TokenLinked Token 
    Dim TLT As TOKEN_LINKED_TOKEN 
    Dim TLTSize& 
    TLTSize = Len(TLT.LinkedToken) 

    Dim hLinkedToken& 
    Dim iRetSize& 
    bRet = GetTokenInformation(hToken, TOKEN_INFORMATION_CLASS.TokenLinkedToken, hLinkedToken, TLTSize, iRetSize) 
    WriteLog "gettokeninformation: " & bRet & " linkedtoken: " & TOKEN_INFORMATION_CLASS.TokenLinkedToken & " linked2: " & hLinkedToken 

    'Use CreateEnvironment Block with the original token to create an environment for the new program with the USER Environment 
    Dim lpEB& 
    bRet = CreateEnvironmentBlock(lpEB, hToken, False) 
    WriteLog "Createenvblock: " & bRet 

    If bRet Then 

     Dim pi As PROCESS_INFORMATION 
     Dim si As STARTUPINFO 
     si.lpDesktop = uWinstationNameStrPtr ' '”Winsta0\default” 
     si.cb = Len(si) 

     Dim lRet& 
     lRet = CreateProcessAsUser(_ 
     hLinkedToken, _ 
     "", _ 
     uAppName, _ 
     0&, _ 
     0&, _ 
     0&, _ 
     NORMAL_PRIORITY_CLASS, _ 
     0&, _ 
     0&, _ 
     si, _ 
     pi) 

     'Give user a feedback 
     If lRet <> 0 Then 
      WriteLog ":-) createprocessasuser succeeded!" 
     Else 
      WriteLog ":-(failed createprocessasuser! error: " & Err.LastDllError 
     End If 
    End If 

    WriteLog "pstartappinsessions}" 

End Function 
+0

ローカルシステムアカウントには、システム全体に対して多くの制御権があります。ログオンしているユーザーのコンテキストで更新プログラムを実行する必要がありますか?また、[lpCommandLine](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682429.aspx)パラメータに関するドキュメントも参照してください。 (具体的には、実行可能ファイルを探す場所とパス内のスペースについての部分) – theB

+0

@theB私の知る限り、ログオンしているユーザーのコンテキストで更新プログラムを実行する必要がありますが、私は口座を扱う際には初心者です。ありがとう、私はlpCommandLineを見ていきますが、私のパスにはスペースがありません。 –

+0

このポストによれば、(http://stackoverflow.com/questions/14001186/clarification-on-calling-createprocessasuser-with-command-line-parameters-using)Iは、uAppName = uAppName&ChrW(160)にuAppNameを変更しましたそれは何の違いもありませんでした。また、uAppNameを2番目のパラメータとして使用すると、APIエラー2が発生しました(指定されたファイルが見つかりません)。 –

答えて

4

ERROR_FILE_NOT_FOUNDは、実行可能ファイルが見つからないことを強く示唆しています。つまり、問題はlpApplicationNameまたはlpCommandLineです。 documentationから:

lpApplicationNameのパラメータはNULLです。その場合、モジュール名は、lpCommandLine文字列内の空白で区切られた最初のトークンでなければなりません。スペースを含む長いファイル名を使用している場合は、引用符で囲まれた文字列を使用して、ファイル名の終わりと引数の開始位置を指定します。それ以外の場合は、ファイル名があいまいです。 [...]ファイル名に拡張子が含まれていない場合は、.exeが追加されます。

lpApplicationNameがnullの場合は、実行するプログラムでlpCommandLineを開始する必要があります。プログラムへのパスにスペースが含まれている場合は、パスを引用符で囲む必要があります。

lpApplicationNameがnullの場合、lpCommandLineがその値をコマンドプロンプトに貼り付けることで有効かどうかをテストできます。

関連する問題