Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UAC需要控制台应用程序_C#_.net_.net 2.0_Uac_Manifest - Fatal编程技术网

C# UAC需要控制台应用程序

C# UAC需要控制台应用程序,c#,.net,.net-2.0,uac,manifest,C#,.net,.net 2.0,Uac,Manifest,我有一个控制台应用程序,需要使用一些需要管理员级别的代码。我读到需要添加清单文件myprogram.exe.Manifest,如下所示: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0

我有一个控制台应用程序,需要使用一些需要管理员级别的代码。我读到需要添加清单文件myprogram.exe.Manifest,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator">
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

但它仍然不会引发UAC(在控制台中或在VS中调试时)。我如何解决这个问题

更新
如果我在Administrator中运行解决方案,或者在Administrator中运行/bin/*.exe,我就能够使它工作。我仍然在想,是否有可能在应用程序启动时弹出一些东西,而不是显式右键单击>以管理员身份运行?

您需要将UAC清单作为嵌入式Win32资源嵌入。看

简而言之,您可以使用Windows SDK命令行工具将其嵌入到可执行文件中

通过将以下行作为生成后任务放置在VS项目的属性中,可以将其作为生成后步骤进行自动化:

mt.exe -manifest "$(ProjectDir)$(TargetName).exe.manifest" -updateresource:"$(TargetDir)$(TargetName).exe;#1"

对于任何使用VisualStudio的人来说,这都非常简单。我正要去安装Windows SDK并执行mt.exe后期构建步骤,然后才意识到它已内置到VS中。我想我会为后代记录它

  • 项目|添加新项目->Visual C#项目->应用程序清单文件
  • 打开app.manifest,将requestedExecutionLevel@级别更改为“requireAdministrator”
  • 建造

  • Ta da

    Scott的回答将按照您的要求执行,但Microsoft建议控制台应用程序显示“拒绝访问”消息,而不是提示提升

    发件人:

    控制台应用程序在控制台窗口上显示其输出,而不是 具有单独的用户界面。如果应用程序需要完全管理员 要运行,则需要从中启动该应用程序 一个升高的控制台窗口

    对于控制台应用程序,必须执行以下操作:

  • 将您的应用程序标记为“asInvoker”:您可以通过编写应用程序的清单来完成此操作,在清单中设置RequestedExecutionLevel==asInvoker。此设置允许来自非提升上下文的调用者创建您的流程,从而允许他们继续执行步骤2

  • 如果应用程序在没有完全管理员访问令牌的情况下运行,请提供错误消息:如果应用程序是在非提升控制台中启动的,则应用程序应给出简短消息并退出。建议的消息是:“访问被拒绝。使用所选选项需要管理员权限。请使用管理员命令提示符完成这些任务。”

  • 应用程序还应返回启动失败时所需的错误代码error_ELEVATION_,以便于编写脚本

    我的C#代码如下。它在Windows XP(管理员->确定,标准用户->拒绝)和Windows Server 2008(提升管理员->确定,非提升管理员->拒绝,标准用户->拒绝)上进行测试


    你是以管理员的身份运行应用程序吗?我是以普通用户的身份运行VS,所以不是。但是,当我右键单击控制台应用程序并以管理员的身份运行它时,它会工作。我希望在VisualStudio中点击RUN而不是bugging时出现“UAC弹出窗口”。顺便说一下,当我在管理员模式下运行VS时,它会工作。如果我没有在管理员模式下运行,我希望弹出窗口,让我切换到管理员模式。您是否使用清单工具(mt.exe)将清单嵌入myprogram.exe?或者清单就在磁盘上,在同一个目录中?mt.exe在Windows SDK中?我已经访问了您的链接,但它看起来是C++。它是Windows SDK的一部分,是的。
    static int Main(string[] args)
    {
        if (!HasAdministratorPrivileges())
        {
            Console.Error.WriteLine("Access Denied. Administrator permissions are " +
                "needed to use the selected options. Use an administrator command " +
                "prompt to complete these tasks.");
            return 740; // ERROR_ELEVATION_REQUIRED
        }
    
        ...
        return 0;
    }
    
    private static bool HasAdministratorPrivileges()
    {
        WindowsIdentity id = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(id);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }