WPF-要求以管理員身份打開應用程序


首先,為什么要以管理員權限打開應用程序呢?

管理員擁有計算機管理的最高權限,以管理員身份可以執行任何操作,而普通用戶則有很大限制,比如非管理員不能修改注冊表,不能自己安裝軟件等等。

這次做了個配置固定ip的桌面應用程序,功能和師兄的固定ip批處理文件作用一樣。師兄的批處理文件需要以管理員身份運行,所以我做同樣也需要。在c#中怎么做呢?有三個辦法。

一、在項目屬性里添加app.manifest(應用程序清單文件)

    1.打開項目的屬性

    2.選擇“安全性”,勾選“啟用ClickOnce安全設置”

    blob.png

    3.然后會在Properties里自動生成 app.manifest

    blob.png

    4.打開app.manifest,找到圖中箭頭指向位置,修改為level=“requireAdministrator”(如圖注釋所述,用戶賬戶控制級別有asInvoker(當前調用者,以當前權限運行),requireAdministrator(要求管理員權限),highestAvailable(當前用戶可以獲得的最高權限))

    blob.png

    5.如果現在直接運行會報錯:blob.png

    所以要在之前的屬性里取消勾選“啟用ClickOnce安全設置”。

    現在運行程序就會要求以管理員身份運行了。

    在vs里:blob.png

    另外,在以管理員身份運行的vs里對其他程序的調用也會以管理員身份,因為程序的默認用戶賬戶控制是asInvoker(以當前調用權限運行)。

 

二、直接在項目里添加“應用程序清單”這個類

blob.png

blob.png

對app.manifest的相應修改同第一個辦法。

 

三、在App.xaml.cs里通過System.Diagnostics.Process.Start()方式啟動程序

打開App.xaml.cs,編輯代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using  System;
using  System.Reflection;
using  System.Security.Principal;
using  System.Windows;
 
namespace  管理員運行
{
     /// <summary>
     /// App.xaml 的交互邏輯
     /// </summary>
     public  partial  class  App : Application
     {
         public  App()
         {
 
             /**
              * 當前用戶是管理員的時候,直接啟動應用程序
              * 如果不是管理員,則使用啟動對象啟動程序,以確保使用管理員身份運行
              */
             //獲得當前登錄的Windows用戶標示
             WindowsIdentity identity = WindowsIdentity.GetCurrent();
             WindowsPrincipal principal =  new  WindowsPrincipal(identity);
             //判斷當前登錄用戶是否為管理員
             if  (principal.IsInRole(WindowsBuiltInRole.Administrator))
             {
                 //如果是管理員,則直接運行
                 Run( new  MainWindow());
             }
             else
             {
                 //創建啟動對象
                 System.Diagnostics.ProcessStartInfo startInfo =  new  System.Diagnostics.ProcessStartInfo();
                 startInfo.UseShellExecute =  true ;
                 startInfo.WorkingDirectory = Environment.CurrentDirectory;
                 startInfo.FileName = Assembly.GetExecutingAssembly().Location;
                 //設置啟動動作,確保以管理員身份運行
                 startInfo.Verb =  "runas" ;
                 try
                 {
                     System.Diagnostics.Process.Start(startInfo);
                 }
                 catch
                 {
                     return ;
                 }
                 //退出
                 Application.Current.Shutdown();
 
             }
         }
     }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM