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
ローカルシステムアカウントには、システム全体に対して多くの制御権があります。ログオンしているユーザーのコンテキストで更新プログラムを実行する必要がありますか?また、[lpCommandLine](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682429.aspx)パラメータに関するドキュメントも参照してください。 (具体的には、実行可能ファイルを探す場所とパス内のスペースについての部分) – theB
@theB私の知る限り、ログオンしているユーザーのコンテキストで更新プログラムを実行する必要がありますが、私は口座を扱う際には初心者です。ありがとう、私はlpCommandLineを見ていきますが、私のパスにはスペースがありません。 –
このポストによれば、(http://stackoverflow.com/questions/14001186/clarification-on-calling-createprocessasuser-with-command-line-parameters-using)Iは、uAppName = uAppName&ChrW(160)にuAppNameを変更しましたそれは何の違いもありませんでした。また、uAppNameを2番目のパラメータとして使用すると、APIエラー2が発生しました(指定されたファイルが見つかりません)。 –