0

我正在使用 psexec 运行一个远程脚本,该脚本对远程系统中存在的打印对象执行一些 UI 操作。具体来说,使用的 API 是 SHInvokePrinterCommand() 来调用打印机对象的打印机属性。

当用户在 Windows 7 上登录(因此可见桌面)执行时,整个事情工作正常。但是当没有用户登录时,该过程无法工作,API(SHInvokePrinterCommand)成功返回但它没有似乎做任何工作。WINDOWS XP 在类似条件下,WORKS FINE。

该观察使我相信它与这些操作系统中不同的会话和“窗口站”架构有关。通过远程进程中的一些编码,我能够确定远程进程是由 psexec 在非零会话(会话 2)中启动的,并且它所连接的唯一窗口站是“WinSta0”。(我使用了 EnumWindowStations( ) 为了那个原因)。WinSta0 是唯一接收来自键盘、鼠标等输入的 Windows 站。

有了这么多的观察,我不明白是什么让整个事情在 Windows 7 的情况下不起作用,没有登录。基本上打印机的属性页面在这种情况下实际上没有被调用。用于执行远程进程的 psexec 形成的会话是否以某种方式不是“完整”会话?有什么办法可以解决这个问题?

任何想法或建议都非常受欢迎。

4

1 回答 1

0

我想到了几件事,主要与 Windows Vista 及更高版本的安全性增加有关。

  1. SHInvokePrinterCommand在 Vista 及更高版本中已弃用。
  2. PSExec 在服务中运行脚本,该服务在 Vista 及更高版本中不再具有桌面访问权限
  3. 当没有登录用户时,HKEY_CURRENT_USER不存在,任何读取它的尝试都会失败。
于 2013-09-19T18:18:19.073 回答