ホームページ  >  記事  >  バックエンド開発  >  デフォルトで管理者としてプログラムを実行する C# のサンプル コードの詳細な紹介

デフォルトで管理者としてプログラムを実行する C# のサンプル コードの詳細な紹介

黄舟
黄舟オリジナル
2017-03-14 13:47:023227ブラウズ

font-family:'Microsoft YaHei'; font-size:24px">1. 設定ファイル

オペレーティング システムを使用して、管理者としてプログラムを実行します。 セキュリティを強化するために、UAC (ユーザー アカウント制御) メカニズムが追加されました。UAC がオンになっている場合、ユーザーが管理者権限でログインしている場合でも、アプリケーションはシステム ディレクトリ、システム レジストリなどにアクセスできなくなります。 . デフォルトでは、システムに影響を与える可能性があります。このメカニズムはシステムのセキュリティを大幅に強化しますが、アプリケーション開発者にとっては、ユーザーに UAC を強制的に無効にすることはできませんが、開発したアプリケーションを実行する必要がある場合があります。管理者として、つまり Win7 は管理者として実行されますが、そのような機能を実装するにはどうすればよいでしょうか? Win7 でいくつかの

インストール

プログラムを実行すると、最初にダイアログ ボックスが表示され、ユーザーにインストールするかどうかを確認するよう求められます。このプログラムによるコンピューター構成の変更を許可することに同意しますが、私たちが作成したアプリケーションはデフォルトではこのプロンプトを表示せず、管理者権限で実行することはできません。この記事では、ユーザーにプロンプ​​トを表示するように C# プログラムを設定する方法を紹介します。管理者権限で実行するにはまず、プロジェクトに Application Man

if

est File

を追加します。デフォルトの設定は次のとおりです:

2aaf03e419584feed0654e5769a6311a
af69af555fb71efffa5a2b73610189d3
  1fd5985ee16d136d0e6ef78db7b2308b
  f560251b6a20897d09156a597d9f040e
    9508b1f164efb2015f73af08732650fc
      3426a22aa48b4bc00f556a5b6b4a9447
        dfb34861a4333e61cbd6ff39e54db7e3
        f0d4bacee36971d13868a143966bbefd
        5963a0b5cd76781a42eeaa7bee625065
            If you want to utilize File and Registry Virtualization for backward
            compatibility then delete the requestedExecutionLevel node.
        -->
        92e66feba285a57f20e9f0f143b0d32a
      c3aca22a047a003888d4809860c6817a
    31ede3b82b5d181b27e77cc95deae041
  c3b68afd42c2202b387345eb8309d7c2
68414a759ee37711ded5ae4a6075cf5c

requestedExecutionLevel 項目があることがわかります。この構成では、現在のアプリケーションによって要求される実行許可レベルを構成するために使用されます。次の表に示すように、この項目には 3 つの値から選択できます。

asInvokerアプリケーションは、親プロセスと同じアクセス トークンを使用して実行されます。ドキュメントhighestAvailable現在の 管理者のみのアプリケーションに推奨されます。アプリケーションはすでに昇格して実行されています。
この で前に提供されたガイダンスに従って、内部標高ポイントを使用してリフラクタリングを実行することをお勧めします。
アプリケーションは、ユーザーが取得できる最高の権限で実行されます。 将来のリリースでアプリケーションをリフラクタリングすることを計画してください。アプリケーションは必要です。管理者に対してのみ実行され、管理者のフル アクセス トークンを使用してアプリケーションを起動する必要があります。

asInvoker : 如果选这个,应用程序就是以当前的权限运行。

highestAvailable: 这个是以当前用户可以获得的最高权限运行。

requireAdministrator: 这个是仅以系统管理员权限运行。

默认情况下是 asInvoker。

highestAvailable 和 requireAdministrator 这两个选项都可以提示用户获取系统管理员权限。那么这两个选项的区别在哪里呢?

他们的区别在于,如果我们不是以管理员帐号登录,那么如果应用程序设置为 requireAdministrator ,那么应用程序就直接运行失败,无法启动。而如果设置为 highestAvailable,则应用程序可以运行成功,但是是以当前帐号的权限运行而不是系统管理员权限运行。如果我们希望程序在非管理员帐号登录时也可以运行(这种情况下应该某些功能受限制) ,那么建议采用 highestAvailable 来配置。

关于requestedExecutionLevel 设置的权威文档请参考下面链接:

Create and Embed an Application Manifest (UAC)

下面是修改后的配置文件:

2aaf03e419584feed0654e5769a6311a
60bbe233cf06337e0e65dbaa5f44e02c
  1fd5985ee16d136d0e6ef78db7b2308b
  f560251b6a20897d09156a597d9f040e
    9508b1f164efb2015f73af08732650fc
      3426a22aa48b4bc00f556a5b6b4a9447
        4d6ce38d92d8b695781d014536bedd8b
        f0d4bacee36971d13868a143966bbefd
        5963a0b5cd76781a42eeaa7bee625065
            If you want to utilize File and Registry Virtualization for backward 
            compatibility then delete the requestedExecutionLevel node.
        -->
        0fa17fcd26d23735e0158d444f4642d9
      c3aca22a047a003888d4809860c6817a
    31ede3b82b5d181b27e77cc95deae041
  c3b68afd42c2202b387345eb8309d7c2
68414a759ee37711ded5ae4a6075cf5c
配置文件修改后,我们运行应用程序,就会首先弹出这样一个提示框,点 Yes 后,程序才可以继续运行,并且获得系统管理员的权限。
.csharpcode, 
.csharpcode pre { font-size: small; color: black; 
font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ }
 .csharpcode pre { margin: 0em; } 
 .csharpcode .rem { color:
 #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode 
 .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; }
  .csharpcode .html { color: #800000; } .csharpcode
 .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } 
  .csharpcode .lnum { color: #606060; }


下面再来看看程序如何知道当前运行在系统管理员权限还是非系统管理员权限:

        public static bool IsAdministrator()
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }
.csharpcode, 
.csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace;
 background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color:
 #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode 
 .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; }
  .csharpcode .html { color: #800000; } .csharpcode
 .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } 
  .csharpcode .lnum { color: #606060; }


这段代码可以用于判断当前程序是否运行在系统管理员权限下。如果配置为 asInvoker,在win7 下,这个函数会返回 false ,如果是 requireAdministrator  则返回 true。

二、通过编程以管理员身份运行程序

在读写注册表“HKEY_LOCAL_MACHINE\SOFTWARE\”下的项时,明明注册表中有,但程序OpenSubKey始终返回Null,考虑到可能是因为权限的原因,于是我以管理员身份运行了一次,结果测试成功!原来真的是权限的问题,于是就在程序里面加入了默认以管理员身份运行的代码。下面让我们看看是怎么实现的吧!


程序默认以管理员身份运行

static void Main(string[] Args)
        {
            /**
             * 当前用户是管理员的时候,直接启动应用程序
             * 如果不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行
             */
            //获得当前登录的Windows用户标示
            System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            //创建Windows用户主题
            Application.EnableVisualStyles();

            System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
            //判断当前登录用户是否为管理员
            if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
            {
                //如果是管理员,则直接运行

                Application.EnableVisualStyles();
                Application.Run(new Form1());
            }
            else
            {
                //创建启动对象
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                //设置运行文件
                startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
                //设置启动参数
                startInfo.Arguments = String.Join(" ", Args);
                //设置启动动作,确保以管理员身份运行
                startInfo.Verb = "runas";
                //如果不是管理员,则启动UAC
                System.Diagnostics.Process.Start(startInfo);
                //退出
                System.Windows.Forms.Application.Exit();
            }
        }

打开程序集里的Program.cs文件,并将其中Main方法中的代码替换为以上代码即可实现程序默认以管理员身份运行。


以上がデフォルトで管理者としてプログラムを実行する C# のサンプル コードの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。