使用管理员权限运行

确定应用程序需要在哪种类型的帐户下运行的第一步是检查应用程序将使用的资源以及它将调用哪些特权 API。 你可能会发现应用程序或其大部分不需要管理员权限。 Michael Howard 和 David LeBlanc 撰写的安全代码很好地介绍了如何进行此评估,强烈建议使用。 (此资源可能在某些语言和国家/地区不可用。)

可以通过使用以下方法之一来提供应用程序所需的特权,减少受到恶意攻击的风险:

  • 在特权较低的帐户下运行。 执行此操作的一种方法是使用 PrivilegeCheck 来确定令牌中启用了哪些权限。 如果可用权限不足以执行当前操作,则可以禁用该代码,并要求用户使用管理员权限登录到帐户。
  • 闯入需要管理员权限的单独应用程序功能。 可以为用户提供执行 RunAs 命令的快捷方式。 有关如何设置快捷方式的详细说明,请在“帮助”中搜索“runas”。 可以通过编程方式为应用程序配置 AppId Key 注册表项下的 RunAs 命令。
  • 通过调用 CredUIPromptForCredentials (GUI) 或 CredUICmdLinePromptForCredentials (命令行) 对用户进行身份验证,以获取用户名和密码。 有关示例,请参阅 询问用户凭据
  • 模拟用户。 在系统等高特权帐户下启动的进程可以通过调用 ImpersonateLoggedOnUser 或类似的 Impersonate 函数来模拟用户帐户,从而降低特权级别。 但是,如果将对 RevertToSelf 的调用注入到线程中,则进程将返回到原始系统特权。

如果已确定应用程序必须在具有管理员特权的帐户下运行,并且管理员密码必须存储在软件系统中,请参阅 处理密码 ,了解安全执行此操作的方法。