提问



一旦我的程序安装在客户端计算机上,如何强制我的程序在Windows 7上以管理员身份运行?

最佳参考


您将要修改嵌入在程序中的清单。这适用于Visual  Studio  2008及更高版本:Project + Add New Item,选择Application Manifest File。将<requestedExecutionLevel>元素更改为:


 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />


用户在启动程序时会收到UAC提示。明智地使用;他们的耐心很快就会消失。[22]

其它参考1


在你的清单中添加requestedExecutionLevel元素只是战斗的一半;你必须记住UAC可以关闭。如果是,则必须执行检查旧学校方式并在用户不是管理员时设置错误对话框(在线程CurrentPrincipal上调用IsInRole(WindowsBuiltInRole.Administrator)。[[[23] [24]

其它参考2


我实现了一些手动执行的代码:


using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}

其它参考3


您可以在EXE文件中嵌入清单文件,这将导致Windows(7或更高版本)始终以管理员身份运行该程序。


您可以在步骤6:创建和嵌入应用程序清单(UAC)(MSDN)中找到更多详细信息。[25]

其它参考4


详细步骤如下。



  1. 将应用程序清单文件添加到解决方案

  2. 将应用程序设置更改为app.manifest

  3. 将requestedExecutionLevel的标记更新为requireAdministrator。



[26]


[27]


[28]


[29]


请注意,使用此代码需要关闭ClickOnce的安全设置,为此,请进入属性 - >安全性 - > ClickOnce安全性

其它参考5


在Visual  Studio  2008上工作时,右键单击Project -> Add New Item,然后选择Application Manifest File


在清单文件中,您将找到标签requestedExecutionLevel,您可以将级别设置为三个值:


<requestedExecutionLevel level="asInvoker" uiAccess="false" />


要么


<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />


要么


<requestedExecutionLevel level="highestAvailable" uiAccess="false" />


要将应用程序设置为以管理员身份运行,您必须选择中间应用程序。

其它参考6


在Visual Studio 2010中,右键单击项目名称。
点击查看Windows设置,生成并打开一个名为app.manifest的文件。
在此文件中,将asInvoker替换为requireAdministrator,如文件中注释部分所述。

其它参考7


按照


<requestedExecutionLevel level="highestAvailable" uiAccess="false" />


如果您还没有应用程序清单或者不知道如何添加应用程序清单,则需要添加应用程序清单。由于某些项目不会自动添加单独的清单文件,首先转到项目属性,导航到应用程序选项卡,然后检查以确保您的项目不排除点击底部的清单。



  • 接下来,右键单击项目

  • 添加新项目

  • 最后,找到并单击应用程序清单文件


其它参考8


在代码中执行此操作的另一种方法是在@NG的答案中检测进程是否像管理员一样运行。然后再次打开应用程序并关闭当前的应用程序。


当应用程序在某些条件下运行时仅需要管理员权限时,例如将自身安装为服务时,我会使用此代码。所以它不需要像其他答案一样以管理员身份运行。


请注意下面的代码NeedsToRunAsAdmin是一种检测当前条件是否需要管理员权限的方法。如果返回false,代码将不会提升自身。这是这种方法相对于其他方法的主要优点。


虽然这段代码具有上述优点,但它确实需要重新启动它作为一个新的过程,而这个过程并不总是你想要的。


private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

private static bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}

其它参考9


这是这个答案的简化版


public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (Exception)
    {
        return false;
    }
}

其它参考10


您可以使用ClickOnce安全设置创建清单,然后将其禁用:


Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings


单击它后,将在项目的属性文件夹 app.manifest 下创建一个文件,一旦创建,您可以取消选中Enable ClickOnce Security Settings选项


打开该文件并更改此行:


<requestedExecutionLevel level="asInvoker" uiAccess="false" />


至:


 <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />


这将使程序需要管理员权限。

其它参考11


右键单击您的可执行文件,转到属性>兼容性,然后选中以管理员身份运行此程序框。


如果您想以管理员身份为所有用户运行它,请在更改所有用户的设置中执行相同的操作。