使用管理员权限运行
确定应用程序需要运行的帐户类型的第一步是检查应用程序将使用的资源以及它将调用哪些特权 API。 你可能会发现应用程序或大部分应用程序不需要管理员权限。 编写安全代码,迈克尔·霍华德和大卫·勒布兰克提供了有关如何执行此评估的出色描述,强烈建议这样做。 (此资源可能在某些语言和国家/地区不可用。
可以使用以下方法之一,为应用程序所需的特权提供更少的恶意攻击风险:
- 在特权较少的帐户下运行。 执行此作的一种方法是使用 PrivilegeCheck 来确定令牌中启用了哪些特权。 如果可用权限不足以执行当前作,则可以禁用该代码,并要求用户使用管理员权限登录到帐户。
- 闯入需要管理员权限的单独应用程序功能。 可以为用户提供执行 RunAs 命令的快捷方式。 有关如何设置快捷方式的详细说明,请在“帮助”中搜索“runas”。 以编程方式,可以在应用程序的 AppId 密钥 注册表项下配置 RunAs 命令。
- 通过调用 CredUIPromptForCredentials (GUI) 或 CredUICmdLinePromptForCredentials (命令行)来获取用户名和密码,对用户进行身份验证。 有关示例,请参阅 请求用户输入凭据。
- 模拟用户。 在系统等高特权帐户下启动的进程可以通过调用 ImpersonateLoggedOnUser 或类似的模拟函数来模拟用户帐户,从而减少特权级别。 但是,如果将对 RevertToSelf 的调用注入到线程中,则进程将返回到原始系统特权。
如果确定应用程序必须在具有管理员权限的帐户下运行,并且管理员密码必须存储在软件系统中,请参阅 处理密码,了解安全执行此作的方法。