0

这个问题我纠结了很久。这是我的场景:我创建了一个 Windows 服务,我希望该服务启动一个带有交互式 GUI 的可执行安装程序。由于该服务在我的 Windows 10 系统上的 Session0 下运行,我必须找到一种方法来正确执行此操作。
我搜索了很多,发现了一些关于如何从 Windows 服务模拟用户的主题。我已经尝试了他们的每一种方式。他们都没有真正解决我的问题。手续基本清楚。
1.获取一些用户空间进程的token,我选择explorer.exe。

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

2.复制令牌

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。
我的猜测是:我已经以某些用户身份启动了安装程序,但没有管理员权限。因此,安装程序在需要执行需要管理员权限的操作时会弹出一个错误。
我这里没有放弃,又google了更多,终于找到了这篇文章。http://www.codeproject.com/Articles/35773/Subverting-Vista-UAC-in-Both-and-bit-Archite

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

4

0 回答 0