【发布时间】:2011-12-26 06:08:16
【问题描述】:
首先,我要感谢所有为本网站工作的人,这对开发人员非常有用。这是我 3 天以来的第一次发展受阻。我在互联网上搜索了解决方案,但没有找到解决此问题的方法。
所以,我开发了一个服务,当用户登录时,它必须在 vista/seven/xp 上执行一个外部程序。该服务的一些特点:
- 自动
- 没有互动。
- 检测登录用户的会话 ID
以交互式用户身份运行外部 GUI 应用程序:
- 为确保打开用户会话,我列出了所有“explorer.exe”进程,并使用 msdn 函数 ProcessIdToSessionId 提取它们的 Pid 和 SessionID
- 如果登录用户的 SessionID 与此“explorer.exe”进程的会话 ID 相同,我确信“好的”桌面正在运行,所以现在我可以执行外部程序。 (我说“好”桌面是因为,如您所知,系统上可以打开多个用户会话)
-
之后,我用这个函数运行应用程序:
function RunInteractive(prog_filename: String; sessionID: Cardinal): boolean; var hToken: THandle; si: _STARTUPINFOA; pi: _PROCESS_INFORMATION; begin ZeroMemory(@si, SizeOf(si)); si.cb := SizeOf(si); SI.lpDesktop := nil; if WTSQueryUserToken(sessionID, hToken) then begin if CreateProcessAsUser(hToken, nil, PChar(prog_filename), nil, nil, False, 0, nil, PChar(ExtractFilePath(prog_filename)), si, pi) then result := true else result := false; end else Begin result := false; End; CloseHandle(hToken); end;
此代码在大多数情况下都可以,除了一个:当我更改用户时。让我用 2 个简单的用户(Domain\user1 和 Domain\user2)来解释一下:
- 为了干净,我安装服务并重新启动系统
- 我打开与 user1 的会话:外部程序已执行,我可以看到它的形式
- 我关闭会话并打开与 user2 的会话:外部程序已执行,我可以看到它的表单。
如果我这样做 X 次,结果总是一样的,非常好...但是如果我这样做:
- 我重新安装服务并重新启动系统
- 我打开与 user1 的会话:外部程序已执行,我可以看到它的形式
- 这一次,我没有关闭会话,而是更改用户 with user2 : 外部程序已执行,但我看不到表单并出现错误:系统错误代码 5:访问被拒绝。
出了点问题,但我没有找到解决方案。感谢您的回答...
【问题讨论】:
-
“解雇所有的人”可能不是你的意思——它的意思是忽略他们或把他们赶走!也许是“鼓掌”或“感谢”?无论如何,我们知道您的意思,只是认为您可能感兴趣:)
-
太棒了!我只对这个词使用谷歌翻译(法语中的“remercier”)。你可以检查一下,谷歌返回:谢谢,解雇和表示感谢。我再也不相信它了
标签: windows delphi winapi windows-7