2

管理者としてマシンを実行していますが、UAC はデフォルト モードに設定されています。

インストール プログラムを開始します (「管理者として実行」を使用)。インストール プロセス (Wix を使用) から、ディスク (C:\ProgramData...) にいくつかのファイルを作成するクライアント プログラムを開始します。

var startInfo = new ProcessStartInfo()
            {
                WorkingDirectory = installLocation,
                FileName = fullPath
            };
Process.Start(startInfo);

プログラムを初めて実行したとき、ローカル ディスクに保存されているすべてのデータに問題なくアクセスできました。

閉じて再起動すると、次のエラー メッセージが表示されます。

パス「C:\ProgramData...」へのアクセスが拒否されました。

「管理者として実行」を使用してアプリケーションを再起動すると、ローカル ディスクからファイルにアクセスできます。今度はエラーなし。アプリケーションを直接起動した場合にのみ、アクセス パス エラーが表示されます。

これは UAC の設定によるものですか、それともローカル ファイルがより特権的なユーザー アカウントで作成されたことが関係しているのでしょうか?

4

4 に答える 4

1

はい、あなたが言うように、ローカル ファイルはより特権のあるユーザー アカウントで作成されます。

これは、管理者資格情報を渡すことで確認できますProcessStartInfo

var startInfo = new ProcessStartInfo()
            {
                WorkingDirectory = installLocation,
                FileName = fullPath,
                UserName = "Administrator",
                Password = "password"
            };

より低い権限で ProgramData フォルダーを作成するだけで、これをバイパスできます。

C#.NET を使用してフォルダに「Everyone」権限を追加する

于 2013-02-06T14:16:44.707 に答える
1

または、管理者権限でアプリケーションを起動するように強制することもできます..

プロジェクト - 新しい項目の追加 - 「アプリケーション マニフェスト ファイル」。

変化する

<requestedExecutionLevel>

<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
于 2013-02-06T14:49:48.553 に答える
1

はい、アプリケーションは、ProgramData やその他の機密性の高いシステム フォルダーまたはユーザー関連のフォルダーにアクセスするために必要な昇格された特権なしで実行されます。

アプリケーション内から生成したすべてのプロセスはwill inherit、アプリケーションが持っている特権です。

これらのフォルダーにアクセスできるように、起動時に昇格された権限を要求するアプリケーションのマニフェストを作成する必要があります。

于 2013-02-06T14:13:10.073 に答える
0

新しいプロセスを開始すると、現在のプロセスの権限が継承されます。

したがって、プロセスが昇格された場合、作成されたプロセスも昇格されます。プログラムを 2 回目に実行したときに、昇格されていなければ、生成されたプロセスも昇格されません。

動詞を指定してrunas、生成されたプロセスを手動で昇格できるようにする UAC ポップアップを強制的に表示できます。

ProcessStartInfo startInfo = new ProcessStartInfo
{
    UseShellExecute = true,
    FileName = "cmd.exe",
    Verb = "runas"
};
于 2013-02-06T14:24:10.797 に答える