如何使控制台应用程序始终以管理员身份运行?

时间:2013-03-13 18:14:34

标签: c# console-application uac runas elevated-privileges

我有一个控制台应用程序,它是由erp软件调用的。

他们在erp中调用我的应用程序,当他们这样做时,我总是会收到与执行权限不足相关的错误。

我已经检查了所有用户的exe属性中的“以管理员身份运行此程序”复选框,但结果是相同的。

我已经阅读了一些关于添加清单的内容,该清单将为uac对话框提供应用程序提示,但这不是我想要的,因为应用程序将从服务器上的erp调用,客户端将无法在服务器上看到对话框。 / p>

有人可以解释一下如何让这个控制台应用程序始终以管理员身份运行吗?

3 个答案:

答案 0 :(得分:27)

添加到项目中的应用程序清单文件(添加 - >新项目 - >常规 - >应用程序清单文件)并将以下节点添加到app.manifest中:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

http://msdn.microsoft.com/en-us/library/windows/desktop/bb756929.aspx

答案 1 :(得分:7)

首先,要了解在此过程中的某个时刻将会有一个UAC对话框。没有办法避免它。您可以采取以下几种方法:

  • 让人们提升ERP软件。我将此包括在内仅仅是为了完整性。当您通常不需要权力时,每次运行应用程序时都必须同意UAC提示。不过,这将是一个方便的快速测试,您可以确认,如果您的应用程序被提升,事情就会奏效。从升级过程启动的所有内容都会升级,因此如果您的应用仍然收到错误消息,则不会通过提升来修复此问题。
  • 更改ERP应用中的代码以启动升级后的应用。你提到C#。使用runas动词启动是一种方法。这给ERP开发人员带来了负担,他们可能无法做到这一点。
  • 向您的应用添加清单。您可以嵌入一个,或者如果您的应用程序被称为foo.exe,只需用适当的requestedExecutionLevel手工创建一个foo.exe.manifest文件。要嵌入一个,请使用C#项目的“属性”页面选择正确的清单类型。确保在UseShellExecute设置为true的情况下启动,否则清单将被忽略。

如果您选择第一个选项,则每次启动ERP应用程序时都会显示UAC提示。不好。如果您选择第二个或第三个,则每次从ERP应用程序启动控制台应用程序时都会出现UAC提示。可能是可以接受的。

您可能会考虑的另一件事是更加认真地了解为什么控制台应用程序需要管理员权限。您是在写C的根目录还是编写文件?您是否在HKLM更新注册表项?无论你在做什么,为什么这样做呢?除非您的应用程序安装或配置某些内容(在这种情况下获得UAC提示是正确的),您应该尝试对其进行调整,以便它写入用户前存储并且不需要提升。然后,无论如何,你将不再担心如何将它抬高。

答案 2 :(得分:0)

创建一个包含以下内容的批处理文件:

runas /env /user:%USERDOMAIN%\%USERNAME% cmd.exe /K YourProgramName.exe

%USERDOMAIN%和%USERNAME%被您的管理员帐户详细信息替换。

然后运行它?