C# UAC需要控制台应用程序
我有一个控制台应用程序,需要使用一些需要管理员级别的代码。我读到需要添加清单文件myprogram.exe.Manifest,如下所示: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
<?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中。我想我会为后代记录它
Ta daScott的回答将按照您的要求执行,但Microsoft建议控制台应用程序显示“拒绝访问”消息,而不是提示提升 发件人: 控制台应用程序在控制台窗口上显示其输出,而不是 具有单独的用户界面。如果应用程序需要完全管理员 要运行,则需要从中启动该应用程序 一个升高的控制台窗口 对于控制台应用程序,必须执行以下操作:
你是以管理员的身份运行应用程序吗?我是以普通用户的身份运行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);
}