using System;
using System.Diagnostics;
using System.Security.Principal;
using System.Windows.Forms;
namespace MyVendor.Installation
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if (!IsRunAsAdmin())
{
Elevate();
Application.Exit();
}
else
{
try
{
Installer InstallerForm = new Installer();
Application.Run(InstallerForm);
}
catch (Exception e)
{
//Display Exception message!
Logging.Log.Error("Unrecoverable exception:", e);
Application.Exit();
}
}
}
internal static bool IsRunAsAdmin()
{
var Principle = new WindowsPrincipal(WindowsIdentity.GetCurrent());
return Principle.IsInRole(WindowsBuiltInRole.Administrator);
}
private static bool Elevate()
{
var SelfProc = new ProcessStartInfo
{
UseShellExecute = true,
WorkingDirectory = Environment.CurrentDirectory,
FileName = Application.ExecutablePath,
Verb = "runas"
};
try
{
Process.Start(SelfProc);
return true;
}
catch
{
Logging.Log.Error("Unable to elevate!");
return false;
}
}
}
}
#1 楼
您可以创建清单文件并将应用程序设置为需要管理权限。当您的应用程序运行时,不需要任何代码,这将触发UAC用户提示,屏幕变暗。 >可以使用任何文本编辑器来创建此文件。应用程序清单文件应与扩展名为.manifest的目标可执行文件同名。 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0"
processorArchitecture="X86"
name="<your exec name minus extension>"
type="win32"/>
<description>Description of your application</description>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
#2 楼
为了使您的代码更清晰或与标准更好地融合,我将在代码中进行一些更改。并且变量RunningAsAdmin
应该为小写字母,以匹配camelCasing变量的标准命名方案。而不是否定布尔值的方法,我会放任不管,而是以一种或另一种方式进行检查,这样否定看起来就不正确了返回一个布尔值?从我所看到的来看,使用true / false值实际上并没有执行任何操作。 br /> internal static bool IsRunAsAdmin()
{
var Principle = new WindowsPrincipal(WindowsIdentity.GetCurrent());
return Principle.IsInRole(WindowsBuiltInRole.Administrator);
}
#3 楼
其他选项:首先:有一种机制可通过COM提升应用程序的“部分” Monikers:通过COM,使用正确格式的名称来提升应用程序的一部分,使其脱离进程是资源管理器如何提升自身的一部分)。请参见MSDN http://msdn.microsoft.com/zh-cn/library/ms679687(v=vs.85).aspx
第二:如安娜所说:使用清单。
第三条:与Q中一样通过
runas
运行。
评论
\ $ \ begingroup \ $
是否可以在运行时提升应用程序?
\ $ \ endgroup \ $
– RobertPitt
2011年1月25日19:25
\ $ \ begingroup \ $
@RobertPitt这样,它将在启动时提升。除非授予管理员权限,否则它将不会启动。
\ $ \ endgroup \ $
–亚当·李尔♦
2011-1-25在19:33