【问题标题】:Securely invoking commands with admin rights under Windows在 Windows 下安全地调用具有管理员权限的命令
【发布时间】:2009-03-22 22:56:33
【问题描述】:

我需要从用户帐户启动的软件中准时调用需要管理员权限的命令(net sharenetsh...)。

在 Unix 变体下,我会在我的用户模式软件旁边安装一个小而谨慎编写的带有 suid 位的脚本,它会调用所需的命令。

在 Microsoft Windows 下等效的最佳实践是什么?我对 Vista 友好但兼容 XP 的解决方案特别感兴趣。

【问题讨论】:

    标签: windows sysadmin


    【解决方案1】:

    正如 BobbyShaftoe 所说,在 Windows 中解决此问题的规范方法是通过服务,因为默认情况下服务在 LocalSystem 帐户下执行。任何其他方法都需要以管理员用户身份登录,这需要凭据。

    对于 Vista,您需要的额外信息是客户端应用程序需要通过某种可以跨越会话边界的 IPC 形式与服务通信,因为在 Vista 上,控制台和服务位于不同的会话中。本例中使用的普通 IPC 方法是命名管道。

    同样的解决方案在 XP 中也可以正常工作。

    【讨论】:

    • 这正是我需要的答案;我想使用不需要特定凭据的规范方式。感谢您对 Vista 的额外提示。
    【解决方案2】:

    一种方法是让服务以管理权限运行。然后从您的应用程序中,告诉服务调用这些命令。我假设您不希望用户被要求知道管理凭据。

    【讨论】:

    • 我确实想让用户摆脱诸如知道和输入凭据之类的问题。您的方法很巧妙,但是对于这项任务来说,持续运行的服务不是矫枉过正吗?没有 Windows suid 等价物吗?
    • 没有真正的等价物。您可以从安装用户那里获取用户凭据,并将其以某种加密形式存储在其他地方。但是,用户可能不喜欢这样,您必须在凭据更改时处理这种情况。但它也可以,只需使用 RunAs 功能
    • 但是,我会采用第一种方法。
    【解决方案3】:

    您可以使用 WinAPI 函数 LogonUserCreateProcessAsUser 以编程方式启动具有不同访问权限的新进程。

    对于您的场景,我将使用所需的net 命令编写一个批处理脚本,如果需要,创建一个新的 cmd.exe 进程,以获取脚本名称作为参数。

    此解决方案要求您以某种方式将 LogonUser 中使用的凭据存储在您的应用程序中,因此可能存在安全风险。

    【讨论】:

    • 使用管理权限调用批处理脚本?这是一场等待发生的火车失事灾难。存储管理员凭据也不是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多