8

ユーザーが私のアプリケーションからファイルを保存するとき、現在、制限された場所(C:など)に保存することはできません。これは適切な制限だと思いますが、UACプロンプトを提供して特権を昇格させ、ユーザーが制限された領域に保存できるようにしたいと思います。

このトピックに関して、「runas」を使用して昇格された特権を持つ新しいプロセスを生成することを含む多くの回答を見てきました。また、これは別のユーザーになりすますことで実行できるようです。私が理解していることから、これらの方法はどちらも、ユーザーがユーザーの資格情報を提供する必要があります。

私がやりたいのは、基本的にWindows自体が行うことです。Windows 7でファイルをC:\にコピーしようとすると(UACがデフォルトレベルに設定されていると仮定して)、次のプロンプトが表示されます。

UACプロンプト

UACシールドで[続行]ボタンをクリックすると、ファイルがC:\にコピーされ、資格情報の入力を求められません(管理者権限でログオンしている場合)。

管理者ユーザーのアプリケーションでこの動作を複製するにはどうすればよいですか?彼らはすでに管理者権限を持っているので、他のユーザーになりすます必要はありません。誰かがこのプロセス中にWindowsが行っていることの詳細を提供できますか?昇格された特権を持つ新しいexplorer.exeプロセスを生成していますか?

4

3 に答える 3

6

あなたはWindowsがすることをする必要があります。そして、昇格された権限で実行される新しいプロセスを生成します。ここにショートカットはありません。プロセスの開始時に割り当てられるトークンは、プロセスが持つ権限を決定するものです。プロセスの開始後にそのトークンを変更することはできません。昇格する必要がある場合は、新しいプロセスが必要です。

このトピックに関して、「runas」を使用して昇格された特権を持つ新しいプロセスを生成することを含む多くの回答を見てきました。また、これは別のユーザーになりすますことで実行できるようです。私が理解していることから、これらの方法はどちらも、ユーザーがユーザーの資格情報を提供する必要があります。

いいえ、そうではありません。現在のユーザーが管理者でない場合、UACダイアログは、管理者権限を持つユーザーの新しい資格情報の入力を求めます。これが、肩越しのUACダイアログです。一方、現在のユーザーが管理者である場合は、同意ダイアログが表示されます。これは、セキュリティで保護されたデスクトップに表示されるダイアログであり、[続行]をクリックするように求められます。

Windowsコンポーネントで実行できることの1つは、同意ダイアログを表示せずに昇格されたプロセスを開始することです。これは、Windows 7でのみ(Vistaではなく)発生し、Windows 7で追加された新しいデフォルト設定でUAC設定を使用している場合にのみ発生します。これにより、エクスプローラーは質問に含めたダイアログを表示して開始できます。同意UACダイアログを表示せずにコピーを実行するための昇格されたプロセス。Windowsコンポーネントのみにその機能が付与されます。

しかし、肝心なのは、昇格して実行される新しいプロセスを開始する必要があるということです。runas動詞を使用することは、それを行うための標準的な方法です。

于 2012-05-24T18:47:17.437 に答える
6

昇格された特権/UACのプログラミング

必要以上の特権でアプリケーションを実行することは、最小特権の原則に反しており、潜在的なセキュリティの脆弱性がある可能性があります。これを防ぐために、Windows Vistaではユーザーアカウント制御(UAC)が導入され、現在のユーザーでも管理者としてサインインしている場合でも、特権が制限されたアプリケーションを(通常のユーザーとして)実行してオペレーティングシステムを保護します。ますます多くのXP/2Kユーザーが日常の使用に通常のユーザーアカウントを使用しています。UACを完全に理解するには、最初にUACDemystifiedをお読みください。

開発者が犯しがちな2つのよくある間違いがあります。

  • エンドユーザーに管理者権限でアプリケーションを実行するように要求します。これは必要ではありませんが、ほとんどの場合、設計慣行が悪いためです。これらのアプリケーションは、エンドユーザーを怖がらせるか、セキュリティの脆弱性を潜在的に持っています。
  • エンドユーザーにアプリケーションを昇格して実行するように要求しないでください。ただし、管理者権限が必要な操作を実行してみてください。これらのアプリケーションは、WindowsVistaまたはWindowsXP/2Kの通常のユーザーアカウントで動作します。

ダウンロード可能なサンプルコードは、昇格された特権/UACをプログラミングする方法を示しています。WPFとWindowsフォームの両方のサンプルアプリケーションが提供されています。次のシナリオでアプリケーションを実行して、違いを確認します。

  • 通常のユーザー、Windows XP / Windows Vista:UACシールドアイコンが表示されます。「SavetoC:\」をクリックすると、「Run As」ダイアログが表示され、続行するには管理者パスワードの入力を求められます。
  • 管理者、UACが無効になっているWindows XP / Windows Vista:UACシールドアイコンが非表示になっています。「C:\に保存」をクリックすると、ダイアログなしで完了します。
  • 管理者、UACが有効になっているWindows Vista:UACシールドアイコンが表示されます。「C:\に保存」をクリックすると、続行するためのユーザーの許可を求めるダイアログが表示されます。

ダウンロードへのリンク

昇格された実行の呼び出し(最初に管理者をテスト):

private void SaveToRootFolder_Click(object sender, EventArgs e)
    {
        string fileName = @"C:\Test.txt";
        if (App.IsAdmin)
            DoSaveFile(textBox1.Text, textBox2.Text, fileName);
        else
        {
            NameValueCollection parameters = new NameValueCollection();
            parameters.Add("Text1", textBox1.Text);
            parameters.Add("Text2", textBox2.Text);
            parameters.Add("FileName", fileName);
            string result = Program.ElevatedExecute(parameters);
            if (!string.IsNullOrEmpty(result))
                MessageBox.Show(result);
        }
    }

昇格された実行:

internal static string ElevatedExecute(NameValueCollection parameters)
    {
        string tempFile = Path.GetTempFileName();
        File.WriteAllText(tempFile, ConstructQueryString(parameters));

        try
        {
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.UseShellExecute = true;
            startInfo.WorkingDirectory = Environment.CurrentDirectory;
            Uri uri = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase);
            startInfo.FileName = uri.LocalPath;
            startInfo.Arguments = "\"" + tempFile + "\"";
            startInfo.Verb = "runas";
            Process p = Process.Start(startInfo);
            p.WaitForExit();
            return File.ReadAllText(tempFile);
        }
        catch (Win32Exception exception)
        {
            return exception.Message;
        }
        finally
        {
            File.Delete(tempFile);
        }
    }
于 2012-05-24T18:48:23.257 に答える
1

制限されたオプション。ファイルの移動、名前の変更、コピー、および削除の場合にのみ役立ちます。

SHFileOperation

この機能を使用してファイル操作を実行しようとすると、Windowsはユーザーに昇格プロンプトを表示します。

これにはいくつかの欠点があることに注意してください。

  • これは、移動、名前の変更、コピー、および削除でのみ機能します。この方法で新しいファイルを保存するには、一時ディレクトリに保存してから、目的の場所に移動する必要があります。これでは、[ファイルの保存]ダイアログでUACで保護された場所をターゲットとして選択できないという問題は解決されません。
  • ターゲットディレクトリが存在しない場合(移動またはコピーの場合)、SHFileOperationは、ターゲットディレクトリを作成する必要があるかどうかをユーザーに確認できます。ただし、昇格された特権を要求しないため、UACで保護された場所では失敗します。この回避策は、一時的な場所に存在しないディレクトリを手動で作成してから、それらをターゲットの場所に移動/コピーすることです。これにより、UACプロンプトが表示されます。
  • ユーザーが[移動/コピー]ダイアログで[スキップ]または[キャンセル]を選択した場合、またはユーザーがUACプロンプトで[いいえ]を選択した場合に備えて、緊急時対応計画を立てる必要があります。
于 2012-11-27T23:51:44.170 に答える