【问题标题】:How do I make a console app always run as an administrator?如何使控制台应用程序始终以管理员身份运行?
【发布时间】:2013-03-01 20:36:17
【问题描述】:

我有一个控制台应用程序,它被开发为由 erp 软件调用。

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

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

我已经阅读了有关添加清单的内容,该清单将使应用程序提示 uac 对话框,但这不是我想要的,因为该应用程序将从服务器上的 erp 调用,而客户端将看不到服务器上的对话框。

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

【问题讨论】:

  • 为什么这个控制台程序需要管理员权限?

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


【解决方案1】:

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

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

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

然后运行它?

【讨论】:

  • 这将以该用户身份运行应用程序,但即使用户具有管理员权限,也不会将会话提升为管理员的会话
【解决方案2】:

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

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

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

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

【讨论】:

  • “您可能会考虑的另一件事是更认真地研究控制台应用程序需要管理员权限的原因。”说得好。这正是要问的正确问题。
  • 我正在向 Windows 商店添加 x509 证书,从商店读取证书,访问数据库并连接到外部 Web 服务。这是否必须具有管理权限?
  • 我还在使用 EventLog.WriteEntry() 在事件查看器上记录错误。所以我想我真的需要管理员权限。对吗?
  • 访问数据库、连接到 Web 服务以及写入事件日志绝对不需要管理员权限。第一次创建事件日志。不确定证书,但值得研究
  • 写好事件日志需要提升权限。我已经删除了这行代码,现在我将日志直接写入数据库。现在它正在工作。感谢您为我指出正确的方向。
【解决方案3】:

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

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

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

【讨论】:

  • 这应该是答案,更直接和简单。
  • C++ 的等价物是什么?我找不到 C++ 控制台应用程序的 Application Manifest File 项目。
猜你喜欢
  • 2011-12-29
  • 2011-09-01
  • 2012-02-07
  • 2012-08-08
  • 1970-01-01
  • 2011-09-24
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多