シナリオ:
- Java ベースのインストーラーがあります。
- Java ベースのインストーラーは、C# プログラムを呼び出します。このプログラムの仕事は、ショートカットを作成することです。
- ショートカットの場所は、インストーラーが管理者として実行されているか、通常のユーザーとして実行されているかによって異なります。管理者として実行している場合、「%ALLUSERSPROFILE%\Desktop」へのショートカットを作成しようとしていますが、それ以外の場合は「%USERPROFILE%\Desktop」に書き込みます。
私の印象では、Java プログラムが C# ショートカット メーカー プログラムを呼び出すときに、管理者特権が失われることが問題のようです。
ノート:
- Java ベースのインストーラーを管理者として実行します (右クリックして、管理者として実行します)。
- 管理者権限が必要なレジストリ キーを読み取ることができるため、インストーラーが管理者権限で実行されていることを確認できます。
- 「Process process = Runtime.getRuntime().exec(command);」で C# プログラムを呼び出しています。
- 管理コマンド プロンプトからコマンドを手動で実行すると、コマンドは正常に動作します。(「%ALLUSERSPROFILE%\Desktop」に出力する場合)
- 通常のコマンド プロンプトから同じコマンドを手動で実行すると、System.UnauthorizedAccessException が発生します。(これは予想されることです)。プログラムは、インストーラーから実行した場合と同様にクラッシュします。
例外:
未処理の例外: System.UnauthorizedAccessException: アクセスが拒否されました。(HRESULT からの例外: 0x80070005 (E_ACCESSDENIED)) IWshRuntimeLibrary.IWshShortcut.Save() で
私が見逃しているものについて何か考えはありますか?インストーラーは、通常のユーザーと管理者の両方として実行できるように柔軟である必要があります。この動作を保証するにはどうすればよいですか?
更新 1
実行時に C# プログラムにデバッガーをアタッチしました。それは投げています:
DirectoryNoFoundException was unhandled
The system cannot find the path specified. (Exception from HRESULT: 0x80070003)
ショートカットメーカーコマンドの前に「mkdir」コマンドを追加しました。mkdir コマンドは、ディレクトリへの書き込みを試みる前に、ディレクトリが存在することを確認するだけです。
インストーラーを再構築して実行し、mkdir "%ALLUSERSPROFILE%\Desktop"を実行しようとすると、java が次の例外をスローします。
java.io.IOException: Cannot run program "mkdir": CreateProcess error=2, The system cannot find the file specified
java.io.IOException: Cannot run program "mkdir": CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
この時点で、プロセスが管理者アクセス権を取得していないようです
Process process = Runtime.getRuntime().exec(command);
私は何か他のものを見つけることができるかどうかを確認するつもりです。
更新 2
以下は、私が試したいくつかの情報を私に与えてくれました: Enterprise Logging not translate environment variables in XML Trace Listener fileName specification
%ALLUSERSPROFILE% が翻訳されていないことが示唆されました。
%ALLUSERSPROFILE% の代わりに、次の方法で環境変数の値を取得しました。
String allUsersProfile = System.getenv("ALLUSERSPROFILE");
String userProfile = System.getenv("USERPROFILE");
その後、実際の値を C# プログラムに提供することができました。しかし、私はまだ問題を抱えています。
管理コンソールから "c:\ProgramData\Start Menu" に移動できますが、管理者権限で "explorer" を実行すると、"c:\ProgramData" に移動できますが、それ以降は何も表示されません...調べてみると、「c:\ProgramData\Start Menu」が保護されたオペレーティング システム ファイルであることがわかりました。せっかくなので設定をオンにしてみました。だから今、私はそれを見ることができますが、それに入ることはできません。
システム内部を使用して、explorer.exe を「システム」アクセスに昇格させましたが、まだフォルダーに移動できません (システム内部昇格の参照: http://verbalprocessor.com/2007/12/05/running-a-cmd-ローカルシステムとしてのプロンプト/ )
フォルダを右クリックして、セキュリティタブをチェックアウトしました。私の「システム」ユーザーでもアクセスが制限されているようです。デスクトップにショートカットを書き込む管理者コマンドプロンプトからコマンドを実行できることは少し困惑していますが、この他のプロセスを実行することはできません...アクセスが少し一貫していないこともわかります。