【发布时间】:2009-03-22 22:56:33
【问题描述】:
我需要从用户帐户启动的软件中准时调用需要管理员权限的命令(net share、netsh...)。
在 Unix 变体下,我会在我的用户模式软件旁边安装一个小而谨慎编写的带有 suid 位的脚本,它会调用所需的命令。
在 Microsoft Windows 下等效的最佳实践是什么?我对 Vista 友好但兼容 XP 的解决方案特别感兴趣。
【问题讨论】:
我需要从用户帐户启动的软件中准时调用需要管理员权限的命令(net share、netsh...)。
在 Unix 变体下,我会在我的用户模式软件旁边安装一个小而谨慎编写的带有 suid 位的脚本,它会调用所需的命令。
在 Microsoft Windows 下等效的最佳实践是什么?我对 Vista 友好但兼容 XP 的解决方案特别感兴趣。
【问题讨论】:
正如 BobbyShaftoe 所说,在 Windows 中解决此问题的规范方法是通过服务,因为默认情况下服务在 LocalSystem 帐户下执行。任何其他方法都需要以管理员用户身份登录,这需要凭据。
对于 Vista,您需要的额外信息是客户端应用程序需要通过某种可以跨越会话边界的 IPC 形式与服务通信,因为在 Vista 上,控制台和服务位于不同的会话中。本例中使用的普通 IPC 方法是命名管道。
同样的解决方案在 XP 中也可以正常工作。
【讨论】:
一种方法是让服务以管理权限运行。然后从您的应用程序中,告诉服务调用这些命令。我假设您不希望用户被要求知道管理凭据。
【讨论】:
您可以使用 WinAPI 函数 LogonUser 和 CreateProcessAsUser 以编程方式启动具有不同访问权限的新进程。
对于您的场景,我将使用所需的net 命令编写一个批处理脚本,如果需要,创建一个新的 cmd.exe 进程,以获取脚本名称作为参数。
此解决方案要求您以某种方式将 LogonUser 中使用的凭据存储在您的应用程序中,因此可能存在安全风险。
【讨论】: