C# 注册表中的RUNASADMIN在Windows 7中似乎不起作用

C# 注册表中的RUNASADMIN在Windows 7中似乎不起作用,c#,windows-7,uac,C#,Windows 7,Uac,一段时间以来,我的程序的安装程序使用以下代码使我的应用程序以管理员权限运行。但在Windows7下似乎没有效果。在维斯塔,它工作得很好。如果我右键单击快捷方式并告诉它以管理员身份运行,程序将正常启动。但是通过使用下面的代码,应该使程序一直以这种方式运行。不再是了。有人知道Win 7是否仍使用此键吗?顺便说一句,UAC也在进行中 Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows NT\ CurrentVersion\A

一段时间以来,我的程序的安装程序使用以下代码使我的应用程序以管理员权限运行。但在Windows7下似乎没有效果。在维斯塔,它工作得很好。如果我右键单击快捷方式并告诉它以管理员身份运行,程序将正常启动。但是通过使用下面的代码,应该使程序一直以这种方式运行。不再是了。有人知道Win 7是否仍使用此键吗?顺便说一句,UAC也在进行中

Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows NT\
CurrentVersion\AppCompatFlags\Layers", "C:\App\app.exe", "RUNASADMIN");

谢谢。

我正在使用Windows 7,我可以看到这些键。但是,我认为这不是配置应用程序和安装程序的正确方法

我建议您将清单文件与应用程序(app.exe)一起分发。如果您使用的是Visual Studio 2008,则清单文件甚至可以很容易地嵌入到可执行文件中。然后在清单文件中,您可以要求管理员权限


在win7中,
RUNASADMIN
被放置在键中: 使用install shield 5.1时,
HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers
将值复制到
appcpmctflgsin wow6432node
,而
exe
实际上是以管理员身份运行。

适用于“我没有创建的exe文件”,您表示对该文件感兴趣。它使用了您最初的注册想法

两个可能相关的差异:

  • 对于32位操作系统,我不必担心
    Wow6432Node
    ()
  • 通过使用
    HKLM
    而不是
    HKCU
    ,我不必担心哪个用户正在执行应用程序()

  • 我对这个问题有一个答案/解决办法

    首先,我(尊敬地)不同意以下评论,即使用AppCompatFlags不是“配置应用程序和安装程序的正确方式”。修改注册表的这一部分只是使用Windows GUI镜像以更改可执行文件的权限级别。我发现这个方法比添加清单文件更容易实现。如果用户希望或需要将权限级别更改为不以管理员身份运行,则可以使用GUI轻松地执行此操作

    无论如何,我在尝试将可执行文件的权限级别设置为以管理员身份运行时遇到了同样的问题。我们知道,我们可以使用GUI进行设置:

    • 在快捷方式或.EXE文件上单击鼠标右键,然后选择“属性”
    • 单击兼容性选项卡
    • (此时,您可以仅为您或为所有用户设置权限级别;我更喜欢为所有用户设置权限级别)
    • 单击按钮,更改所有用户的设置
    • 将打开一个新的属性窗口,其中有一个标题为“所有用户的兼容性”的选项卡
    • 在“以管理员身份运行此程序”的特权级别检查下,单击“确定”几次以保存更改
    保存更改后,您将在注册表中找到设置:

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
    "C:\\Program Files (x86)\\My Program\\My Program.exe"="RUNASADMIN"
    
    当我以这种方式使用GUI将
    .exe
    设置为以管理员身份运行时,它总是有效的

    然而,每当我试图在不通过GUI的情况下直接更改注册表时,该程序就不会以管理员身份运行。注册表显示我做了更改,当我查看可执行文件的权限级别时,RunAs administrator被选中为on

    我尝试了几种不同的方法,只需更改注册表即可使
    .exe
    以管理员身份运行:

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
    "C:\\Program Files (x86)\\My Program\\My Program.exe"="RUNASADMIN"
    
    • 使用regedit手动编辑注册表
    • .reg
      文件导入更改
    • 使用命令行工具reg.exe更改注册表
    • 使用了现已失效的Wise脚本工具
    • 使用AutoIT脚本
    所有这些方法都做了同样的事情。注册表已更改,GUI显示该程序应以管理员身份运行,但该程序从未以管理员身份运行

    对于我遇到的这个问题,解决方法是继续使用设置更改
    HKCU
    键和
    HKLM

    [HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
    "C:\\Program Files (x86)\\My Program\\My Program.exe"="RUNASADMIN"
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
    "C:\\Program Files (x86)\\My Program\\My Program.exe"="RUNASADMIN"
    
    如果同时更改这两个注册表部分,则
    .exe
    将作为管理员运行。更重要的是,如果其他用户登录到电脑,该程序将以管理员身份运行。尽管注册中心未对后续用户的HKCU部分进行更改,但仍然存在这种情况


    我不知道这里发生了什么,但它正在工作。

    我使用CMD使用以下命令将此项添加到注册表中:

    reg ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /t REG_SZ /f /v "C:\Program Files (x86)\MyApp\myapp.exe" /d RUNASADMIN
    
    这在Win8Pro-32位版本中效果很好,但在64位版本中不起作用
    我发现在64位Win上运行此命令(作为最终安装阶段在32位安装程序中运行)会导致在
    HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
    上创建条目
    经过一些研究(感谢我的朋友H.Toosi先生),我们找到了正确的解决方案。
    只需在前面的命令末尾添加
    /reg:64
    ,如下所示:

    reg ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /t REG_SZ /f /v "C:\Program Files (x86)\MyApp\myapp.exe" /d RUNASADMIN /reg:64
    

    32位和64位操作系统(win7 32位、win8 32位、win8.1 64位)一切正常。

    谢谢lextm。我不知道可以为我没有创建的exe文件创建清单文件。或者它们也不必嵌入。谢谢你的链接。@JimDel:所有这些链接似乎都与嵌入清单有关。你在哪里看到我是如何“为我没有创建的exe文件”这样做的