在 Windows 7 上的 Delphi 2007 中枚举终端服务会话
我使用 QWINSTA.EXE 从网络上的终端服务器获取会话/用户列表(我的计算机是 Windows 7 Pro,TS 是 Windows Server 2003)。我将该函数的输出传输到一个文本文件,然后处理该文本文件以获取我需要的信息。如果有更好的方法,请原谅并跳过我的冗长帖子并为我指出正确的方向。
我的问题是,ShellExecute()
和 ShellExecuteEx()
都不允许我在没有提升权限的情况下执行该程序。如果您进入未提升的命令提示符,您甚至不会在目录列表中看到 EXE(也没有隐藏属性)。使用“以管理员身份运行”命令提示符,您就可以很好地查看/使用它。无论如何,您都可以从 Windows 资源管理器中看到它。
我浏览了一下,发现了这个宝石: RunFileAsAdminWait()
如果我尝试直接调用 QWINSTA.EXE,则该方法不起作用(失败并显示错误消息:系统错误。代码: 2. 系统找不到指定的文件。
)。如果我将所有内容打包到批处理文件中并在批处理文件上使用 RunFileAsAdminWait() ,那么它似乎工作正常。
我知道但没有使用过 WTSEnumerateSessions()
。除了我刚刚链接到的 MSDN 链接之外,我找不到太多关于它的信息。有人知道使用 Delphi 的 API 的大量参考代码吗?它在 Delphi 2007 的 Windows 单元中不可用。
问题:
是否有另一种/更好的方法来执行需要管理员权限才能访问的 EXE?或者这就是这里发生的事情?
是否有更好的方法来获取终端服务器上的活动会话列表,特别是不需要提升权限的会话?
如果我无法使用此方法,我是否以“正确的方式”进行操作?
感谢您提供的任何帮助!
I'm using QWINSTA.EXE to get the session/user list from a terminal server on our network (my computer is Windows 7 Pro, the TS is Windows Server 2003). I pipe the output of this function to a text file and then process the text file to get the info I need. If there is a better way, please forgive and skip my long winded post and point me in the right direction.
My problem is that neither ShellExecute()
nor ShellExecuteEx()
allow me to even execute the program without first having elevated privileges. If you go to a un-elevated command prompt you won't even see the EXE in a directory listing (no hidden attribute, either). Use a "run as administrator" command prompt and you can see/use it just fine. You can see it from Windows Explorer in any event.
I poked around a bit and found this gem: RunFileAsAdminWait()
that does not work if I try to call QWINSTA.EXE directly (it fails with the error message: System Error. Code: 2. The system cannot find the file specified.
). If I wrap everything up into a batch file and use RunFileAsAdminWait()
on the batch file then it seems to work fine.
I know of, but have not used, WTSEnumerateSessions()
. I have not been able to find much information on it other than the MSDN link I just linked to. Anyone know of a decent chunk of reference code for using that API from Delphi? It's not available in the Windows unit of Delphi 2007.
Questions:
Is there another/better way to execute an EXE that requires Administrator rights to even access? Or is that even what is going on here?
Is there a better way to get the list of active sessions on a terminal server, especially one that does not require elevated privileges?
If I'm stuck using this method, am I doing it "the right way"?
Thank you for any help you can offer!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您必须使用
远程桌面服务 API 函数
要获取此 API 的 Delphi 翻译,请检查JwsclTerminalServer
单元是 JEDI Windows 的一部分安全代码库 (JWSCL)。在您的情况下,为了枚举终端服务器会话,您可以使用 TJwTerminalServer.EnumerateSessions 方法。Instead of pipe the result of the
QWINSTA.EXE
you must use theRemote Desktop Services API Functions
for a delphi translation of this API check theJwsclTerminalServer
unit which is part of the JEDI Windows Security Code Library (JWSCL). in your case for enumerate the terminal server seesion you can use the TJwTerminalServer.EnumerateSessions method.