首先,為什么要以管理員權限打開應用程序呢?
管理員擁有計算機管理的最高權限,以管理員身份可以執行任何操作,而普通用戶則有很大限制,比如非管理員不能修改注冊表,不能自己安裝軟件等等。
這次做了個配置固定ip的桌面應用程序,功能和師兄的固定ip批處理文件作用一樣。師兄的批處理文件需要以管理員身份運行,所以我做同樣也需要。在c#中怎么做呢?有三個辦法。
一、在項目屬性里添加app.manifest(應用程序清單文件)
1.打開項目的屬性
2.選擇“安全性”,勾選“啟用ClickOnce安全設置”
3.然后會在Properties里自動生成 app.manifest
4.打開app.manifest,找到圖中箭頭指向位置,修改為level=“requireAdministrator”(如圖注釋所述,用戶賬戶控制級別有asInvoker(當前調用者,以當前權限運行),requireAdministrator(要求管理員權限),highestAvailable(當前用戶可以獲得的最高權限))
5.如果現在直接運行會報錯:
所以要在之前的屬性里取消勾選“啟用ClickOnce安全設置”。
現在運行程序就會要求以管理員身份運行了。
在vs里:
另外,在以管理員身份運行的vs里對其他程序的調用也會以管理員身份,因為程序的默認用戶賬戶控制是asInvoker(以當前調用權限運行)。
二、直接在項目里添加“應用程序清單”這個類
對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();
}
}
}
}
|