如何从Windows服务模拟管理员用户?

时间:2016-09-19 03:34:16

标签: windows-services windows-10 impersonation administrator session-0-isolation

我长期以来一直坚持这个问题。这是我的场景:我创建了一个Windows服务,我希望该服务能够使用交互式GUI启动可执行安装程序。由于服务在我的Windows 10系统上的Session0下运行,我必须找到一种方法来正确地执行此操作。
我搜索了很多内容,并找到了一些关于如何从Windows服务模拟用户的主题。而且我已经尝试了他们的每一个方法。他们都没有真正解决我的问题。程序基本清楚.1。获取一些用户空间进程的令牌,我选择了explorer.exe。

Process[] processByName = Process.GetProcessesByName("explorer");
hProcess = processByName[0].Handle;
OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, ref procToken)

2.Duplicate token

DuplicateTokenEx(procToken,
                 TOKEN_ALL_ACCESS,
                 ref sa,
                 (int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification,
                 (int)TOKEN_TYPE.TokenPrimary,
                 ref DupedToken);

3.创建环境块

CreateEnvironmentBlock(ref EnvironmentFromUser, DupedToken, false);

4.Invoke CreateProcessAsUser以使用GUI启动我的可执行安装程序。

CreateProcessAsUser(DupedToken,
                        "myexeinstaller.exe",
                        null,
                        ref sa,
                        ref sa,
                        true,
                        CREATE_NEW_PROCESS_GROUP | CREATE_UNICODE_ENVIRONMENT, 
                        EnvironmentFromUser,
                        null,
                        ref si,
                        out pi);

一切正常,直到GUI出现之前出现错误框。我试过两个可执行安装程序并且他们表现出不同的错误。
一个是说:NSIS错误写临时文件。确保临时文件夹有效。
另一个是说:错误访问被拒绝。我以某种方式想出了这两个安装人员的不同之处。第一个尝试在HKEY_CURRENT_USER中写入内容,而第二个尝试在HKEY_LOCAL_MACHINE中写入内容。
我的猜测:我已经以某个用户启动了安装程序但没有管理员权限。因此,当安装程序需要执行需要管理员权限的操作时,安装程​​序会弹出错误。
我没有在此处放弃并搜索更多内容,最后发现了这篇文章。http://www.codeproject.com/Articles/35773/Subverting-Vista-UAC-in-Both-and-bit-Archite

这对我帮助很大。我现在可以在系统帐户下以管理员身份启动安装程序。对于第二个安装程序,它运行良好,但对于第一个安装程序,它无声地失败。我想这可能是因为安装程序现在在系统帐户下运行,而它需要在用户帐户下执行某些操作,例如写入HKEY_CURRENT_USER。
所以问题是我终于获得了管理员权限,但我的安装程序必须在系统帐户下运行。
任何人都可以告诉我,甚至可以从服务启动GUI安装程序并在用户帐户下运行管理员特权?任何想法都很感激,非常感谢。

0 个答案:

没有答案