3

Windows サービスとして実行されるアプリケーションに取り組んでおり、それを自動的に更新しようとしています。


私の現在のアプローチは、サービスを停止し、msi インストーラーを実行してから、サービスを再起動する powershell スクリプトを実行することです。

これは、現時点でのpowershellスクリプトの外観です

Start-Sleep -s 10
Write-Host "update start"
Stop-Service ServiceName1
msiexec /i c:\ProgramData\ProgramName\Install\ServiceName.Setup.msi /passive /l*v C:\ProgramData\ProgramName\Install\log.txt | Out-Null
Start-Service ServiceName1
Write-Host "update finished"

これは私がアプリから実行している方法です

Process.Start("Powershell", @"C:\ProgramData\ProgramName\Install\UpdateApp.ps1");

何が起こるかというと、サービスが停止して再起動しますが、更新されません。msi が実行されないかのようです。ログファイルも表示されません。

昇格したコマンド プロンプトからコマンド ライン アプリとしてサービスを実行すると、期待どおりに動作し、アプリが更新されるため、現在の理論では、サービスは管理者権限で PowerShell スクリプトを実行していないということです。

他の質問は、管理者アカウントを使用するようにサービスのログオン設定をセットアップしたことを示唆しているため、現在ログインしているアカウントとしてサービスを実行するように設定しました。インストーラーを手動で実行しましたが、何も変わりませんでした。


私がやろうとしていることをする方法はありますか?

私は現在、特定の自動更新戦略にコミットしていませんが、このサービスが自動的に更新されることを望んでいることは知っています. したがって、私が何か完全に間違ったことをしている場合、別のアプローチを試みることに 100% オープンです。


アップデート:

msiexecc のエラーと出力をログに記録するために、次の変更を加えました。

Try{
    c:\windows\system32\msiexec.exe /i c:\ProgramData\ProgramName\Install\ServiceName.msi /passive /l*v C:\ProgramData\ProgramName\Install\log.txt | Out-File -filepath C:\ProgramData\ProgramName\Install\output.txt
}
Catch {
    $_ | Out-File C:\ProgramData\ProgramName\Install\errors.txt -Append
}

そのスクリプトを実行した後、次のエラーが見つかりました。

「msiexec」という用語は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。

4

1 に答える 1

1

への呼び出しmsiexecが実際にはターゲットになっていないようですc:\windows\system32\msiexec.exe

この質問によると、Powershell は標準の PATH 環境変数を使用していないようですが、システム サービスのコンテキストではおそらく期待どおりに機能しない独自のスキームがあります。

あなたが言うように、最も簡単な解決策は、おそらくフルパスを指定することですc:\windows\system32\msiexec.exe.

ただし、本番環境では、ローカリゼーションやオペレーティング システムの変更などで問題が発生する可能性があるため、ハードコードされたパスの使用を避けるのがおそらく賢明でしょう。おそらく、サービスからSearchPathまたは .NET に相当するものを使用して、Powershell スクリプトをリアルタイムで書き出すか、パスをmsiexecコマンドライン オプションとして に渡すか、適切な Powershell ソリューションが存在する可能性があります。

于 2016-03-14T22:37:29.130 に答える