【问题标题】:How to Avoid User Account Control or Run windows application in Win7 always in Admin mode如何避免用户帐户控制或在 Win7 中始终以管理员模式运行 Windows 应用程序
【发布时间】:2012-02-05 18:25:37
【问题描述】:

在 WinForms 应用程序中,当我的应用程序启动时,会出现用户帐户控制对话框(仅在 Windows7 中)。

谁能建议我如何以编程方式避免这种情况 - 即我的应用程序应始终以管理员模式启动,或者是否有任何选项可以阻止此对话框出现?

我正在使用 C#,VS2008 进行开发。

【问题讨论】:

  • 您的应用可能根本不应该引起 UAC 提示!通常这意味着应用程序正在做一些愚蠢的事情,比如将日志文件写入 C:\Windows 文件夹或类似文件夹。
  • MattDavey 在我的应用程序中我没有写任何日志文件。

标签: c# .net winforms visual-studio visual-studio-2008


【解决方案1】:

如果不接受提示或告诉 Windows 始终以更高权限启动该应用程序,您将无法自动启动具有更高权限的应用程序。能够以编程方式改变这种行为将违背 UAC 的全部目的。如果 UAC 处于活动状态并且应用程序执行的操作需要比当前用户更高的权限,则 UAC 会自动出现。作为管理员用户并不会授予您在没有先确认的情况下执行所有操作的权利,实际上只有在 UAC 处于活动状态时才会提升您的权限。

您应该做的是在您的应用程序中追踪实际触发 UAC 的原因,并将其删除或修改,以便应用程序不需要更高的权限即可成功完成该任务。您还可以检查应用程序的清单是否请求更高的权限,检查清单中的 requestedExecutionLevel。如果您确实需要更高的权限,您唯一的方法是告诉用户关闭 UAC,这仍然不意味着“普通”用户能够运行您的应用程序。或者在启动应用程序时始终接受提示。

【讨论】:

    【解决方案2】:

    如果您的目标是 Windows Vista,并且您的应用程序需要管理员权限(例如访问程序文件目录),那么除非您包含 Windows 知道的清单,否则它将失败。幸运的是,它非常简单。

    首先,将清单文件添加到您的 .NET 可执行项目的根目录 - 您可以通过选择“添加新项目”并选择“应用程序清单文件”来执行此操作。或者,只需创建一个名为“app.manifest”的空白文件。 Visual Studio 为您提供的标准模板如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" 
    xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
          <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
            <!-- UAC Manifest Options
                If you want to change the Windows User Account Control level replace the 
                requestedExecutionLevel node with one of the following.
    
            <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
            <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
            <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
    
                If you want to utilize File and Registry Virtualization for backward 
                compatibility then delete the requestedExecutionLevel node.
            -->
            <requestedExecutionLevel level="asInvoker" uiAccess="false" />
          </requestedPrivileges>
        </security>
      </trustInfo>
    </asmv1:assembly>
    

    关键部分是requestedExecutionLevel 模式——默认设置为“asInvoker”。这意味着应用程序将在启动应用程序的人的权限下运行 - 请记住,在 UAC 下,即使是 Windows Vista 上的管理员也以用户身份运行,直到他们提升权限。

    如果您的应用程序始终需要管理员权限,那么您可以将此值更改为“requireAdministrator”。现在,每当您的应用程序启动时,它总是会触发 UAC 并要求用户允许管理员访问您的程序。

    请注意,值得认真考虑您是否真的需要这样做,以及为什么这样做 - 尤其是考虑到 UAC 的侵入性体验。例如,您不需要将设置写入 Program Files,因为 Windows 仅为此目的提供了用户配置文件区域和注册表。一般来说,UAC 应该希望能迫使我们所有人更仔细地考虑我们将数据存储在哪里,以及应用程序真正需要什么权限。

    【讨论】:

    • Roget 我做了和你写的一样的事情。在应用程序清单文件中,我把标签放在了 requestExecutionLevel level="highestAvailable" 中。我在其他地方没有做任何更改,但它不起作用(即 UAC 消息框来了)。请帮助。
    • 在我运行应用程序时创建清单后,会出现以下对话框。此任务要求应用程序具有提升的权限。为什么需要使用管理员或其他帐户?在不同的凭据下重新启动。
    【解决方案3】:

    你可以通过写两行代码简单地删除UAC提示,

    Click Here

    string UAC_key = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System";
    Registry.SetValue(UAC_key, "EnableLUA", 0);`
    

    【讨论】:

    • 提供链接描述。
    猜你喜欢
    • 2018-05-11
    • 2013-03-01
    • 1970-01-01
    • 2011-10-22
    • 2010-12-24
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    相关资源
    最近更新 更多