27

管理者レベルを必要とするコードを使用する必要があるコンソールアプリケーションがあります。次のようなマニフェストファイルmyprogram.exe.manifestを追加する必要があることを読みました。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator">
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

ただし、それでもUACは発生しません(コンソールまたはVSでのデバッグ中)。この問題を解決するにはどうすればよいですか?

アップデート

管理者でソリューションを実行するか、管理者で/bin/*.exeを実行すると、それを機能させることができます。明示的に右クリック>[管理者として実行]ではなく、アプリケーションの起動時にポップアップするものを表示できるかどうかまだ疑問です。

4

3 に答える 3

55

Visual Studioを使用している人にとっては、非常に簡単です。VSに組み込まれていることに気付く前に、Windows SDKをセットアップし、mt.exeのビルド後の手順などを実行しようとしていました。後世のために録音すると思いました。

  1. プロジェクト| 新しいアイテムの追加->VisualC#アイテム->アプリケーションマニフェストファイル
  2. app.manifestを開き、requestedExecutionLevel。@levelを「requireAdministrator」に変更します
  3. 建てる

タダ

于 2010-02-02T22:31:01.293 に答える
26

スコットの答えはあなたが求めたことを行いますが、Microsoft は、コンソール アプリケーションが昇格を求めるプロンプトではなく、「アクセスが拒否されました」というメッセージを表示することをお勧めします。

http://msdn.microsoft.com/en-us/library/bb756922.aspxから:

コンソール アプリケーションは、別のユーザー インターフェイスではなく、コンソール ウィンドウに出力を表示します。アプリケーションを実行するために完全な管理者アクセス トークンが必要な場合、そのアプリケーションは管理者特権のコンソール ウィンドウから起動する必要があります。

コンソール アプリケーションに対しては、次の操作を行う必要があります。

  1. アプリケーションを「asInvoker」としてマークする: RequestedExecutionLevel == asInvoker を設定したアプリケーションのマニフェストを作成することで、これを行うことができます。このセットアップにより、昇格されていないコンテキストからの発信者がプロセスを作成できるようになり、ステップ 2 に進むことができます。

  2. アプリケーションが完全な管理者アクセス トークンなしで実行された場合にエラー メッセージを提供する: アプリケーションが昇格されていないコンソールで起動された場合、アプリケーションは簡単なメッセージを表示して終了する必要があります。推奨されるメッセージは次のとおりです。

アプリケーションは、スクリプト作成を容易にするために、起動に失敗した場合にもエラー コード ERROR_ELEVATION_REQUIRED を返す必要があります。

このための私の C# コードは以下のとおりです。Windows XP (管理者 -> OK、標準ユーザー -> 拒否) および Windows Server 2008 (昇格された管理者 -> OK、昇格されていない管理者 -> 拒否、標準ユーザー -> 拒否) でテストされています。

static int Main(string[] args)
{
    if (!HasAdministratorPrivileges())
    {
        Console.Error.WriteLine("Access Denied. Administrator permissions are " +
            "needed to use the selected options. Use an administrator command " +
            "prompt to complete these tasks.");
        return 740; // ERROR_ELEVATION_REQUIRED
    }

    ...
    return 0;
}

private static bool HasAdministratorPrivileges()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);
    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
于 2010-04-21T00:48:00.527 に答える
9

UAC マニフェストを埋め込み Win32 リソースとして埋め込む必要があります。UAC マニフェストをマネージド コードに追加するを参照してください。

つまり、Windows SDK コマンド ライン ツールを使用して実行可能ファイルに埋め込みます。

VS プロジェクトのプロパティにビルド後のタスクとして次の行を配置することで、ビルド後のステップとしてこれを自動化できます。

mt.exe -manifest "$(ProjectDir)$(TargetName).exe.manifest" -updateresource:"$(TargetDir)$(TargetName).exe;#1"
于 2008-11-03T16:21:07.747 に答える