c# - 在没有 UAC 的系统上以管理员权限执行应用程序

标签 c# uac

我有一个必须以管理员权限执行的应用程序。如果 UAC 打开,一切都很好。但是,如果 UAC 关闭,则启动时没有提示(即使对于标准用户)并且应用程序以受限权限启动。

用动词“runas”启动进程不起作用。

有什么方法可以显示标准的 UAC 登录对话框并执行具有管理员权限的应用程序,即使 UAC 关闭也是如此?

更新: 包含 list :

<?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.1.6.0" processorArchitecture="X86" name="setup" type="win32"/>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
            </requestedPrivileges>
        </security>
    </trustInfo>
</asmv1:assembly>

当 UAC 处于事件状态时,一切正常。但如果 UAC 关闭,它就不起作用。

更新 2::MSDN Step 6: Create and Embed an Application Manifest (UAC) 记录了此行为(请参阅表“标准用户帐户的应用程序启动行为”最后一行)。所以我无法用任何 list 解决这个问题。还有其他解决办法吗?

最佳答案

我有一个非常相似的问题,我认为到目前为止的评论没有解决您的实际问题。我相信他们误解了你问题的意图。虽然我的回答不会像您第一次问的那样显示实际的 UAC 对话框,但它会显示一个解决方法。

关闭 UAC 不会不会阻止应用程序以管理员身份运行(假设您有管理员密码,就像您看起来那样),只会让它更难。正如您正确指出的那样,在禁用 UAC 并在 list 中设置 requireAdministrator 后,右键单击并选择 以管理员身份运行 实际上不会提升进程,正如 Microsoft 指出的那样:"Application might launch but will fail later"

两步:

1) 按住 Shift 的同时右键单击应用程序并选择 Run as a different user。然后只需使用您的管理员用户名和密码进行身份验证,您的应用程序就会以管理员身份运行。它对我有用。

screenshot

2) 构建一个运行 asInvoker 并检查管理权限的小型可执行文件。当它在没有它们的情况下运行时,警告用户并告诉他们 Shift-Right Click,然后 Run as a different user。如果您的小程序具有管理员访问权限,则使用 ShellExecute 调用您的主要 requireAdministrator 应用程序。有关流程图,请参见 Figure 9 here

这是一个来自 StackOverflow 某处的 C++ 小代码示例,用于检查管理员访问权限:

BOOL IsUserAdmin(VOID)
{
   BOOL b;
   SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
   PSID AdministratorsGroup; 
   b = AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup); 
   if(true==b) 
   {
      if (!CheckTokenMembership( NULL, AdministratorsGroup, &b)) 
      {
         b = FALSE;
      } 
      FreeSid(AdministratorsGroup); 
   }
   return(b);
}

关于c# - 在没有 UAC 的系统上以管理员权限执行应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17271458/

相关文章:

c# - Async TCP Server 代码示例分析

c# - 根据子元素值(C#、Json.NET)为元素选择 token 模式

c# - 在 ASP.NET MVC 5 中动态添加元数据

c# - 数字表 Oracle 存储过程参数,如何从 C# 传递它

windows-installer - 数字签名的 MSI 仍然提示 UAC

c# - 在 C# 中处理静态字段内存泄漏的最佳实践

c# - 当 UAC 被拒绝时,Process.Start 永远不会返回

Delphi 提升权限按钮

c++ - 无法以标准用户身份创建或写入文件

c# - 如何以管理员身份在 C# 中写入文件?