【发布时间】:2015-10-06 01:54:35
【问题描述】:
我的服务启动一个交互式客户端进程,其内容与以下内容非常相似:https://msdn.microsoft.com/en-us/library/windows/desktop/aa379608(v=vs.85).aspx
服务以本地系统登录时有效,如果它在管理员帐户下运行使用 SE_ASSIGNPRIMARYTOKEN_NAME 和 SE_INCREASE_QUOTA_NAME 权限。
我的问题是当使用 标准用户 帐户或 本地服务 时,它在 OpenWindowStation 失败,错误代码为 5(访问被拒绝)。
// Get a handle to the interactive window station.
hwinsta = OpenWindowStation(_T("winsta0"), // the interactive window station
FALSE, // handle is not inheritable
READ_CONTROL | WRITE_DAC); // rights to read/write the DACL
是否可以从标准用户帐户调用 OpenWindowStation,或者我的服务必须在管理员帐户下运行?我尝试了几乎所有的本地政策,但都没有成功
谢谢!
【问题讨论】:
-
您需要管理员权限才能使用 WRITE_DAC 访问权限打开其他人的窗口站。
-
我试过没有 WRITE_DAC 访问,同样的错误
-
嗯,是的 - 您需要管理员权限才能访问其他人的窗口站。我认为这是学术性的,因为您需要更改权限。而且我相当确定无论如何您都需要管理员权限才能启动新流程。 (如果您以交互登录的同一用户身份运行,可能有办法解决这个问题,但我不确定。)
-
是的,看来我的服务必须在管理员帐户中运行,希望找到一种方法来赋予我的用户帐户特定的权限。
-
恐怕不太可能。如果安全是一个问题,您可能需要考虑特权分离方法,即一个服务作为本地系统运行,其唯一工作是启动交互式客户端进程,一个服务以有限的权限运行并执行其他所有操作。
标签: c++ windows service impersonation privileges