2011-11-17 32 views
1

我使用QWINSTA.EXE從我們網絡上的終端服務器(我的計算機是Windows 7 Pro,TS是Windows Server 2003)獲取會話/用戶列表。我將這個函數的輸出傳遞給一個文本文件,然後處理文本文件以獲得我需要的信息。如果有更好的辦法,請原諒並跳過我冗長的帖子,並指出我的方向正確。在Windows 7上枚舉Delphi 2007中的終端服務會話

我的問題是,ShellExecute()ShellExecuteEx()都不允許我在沒有提升權限的情況下執行程序。如果您轉到未升級的命令提示符,您甚至不會在目錄列表中看到EXE(無隱藏屬性)。使用「以管理員身份運行」命令提示符,你可以看到/使用它就好了。無論如何,你都可以在Windows資源管理器中看到它。

我戳了一下,發現這個寶石:RunFileAsAdminWait(),如果我試圖直接調用QWINSTA.EXE(它失敗,錯誤消息:System Error. Code: 2. The system cannot find the file specified.)不起作用。如果我將所有內容都包裝到批處理文件中,並在批處理文件上使用RunFileAsAdminWait(),那麼它似乎可以正常工作。

我知道,但沒有用過,WTSEnumerateSessions()。除了我剛剛鏈接的MSDN鏈接之外,我一直無法找到關於它的很多信息。任何人都知道從Delphi使用該API的相當一部分參考代碼?這不是提供德爾福的Windows單元2007

問題:

  1. 是否有其他/更好的方式來執行需要管理員權限到連訪問的EXE?或者,即使這裏發生了什麼?

  2. 有沒有更好的方法來獲取終端服務器上的活動會話列表,尤其是那些不需要提升權限的活動會話?

  3. 如果我使用這種方法卡住了,我是在「正確的方式」嗎?

謝謝你提供的任何幫助!

+0

讓我看看我是否有這樣的筆直。您希望運行需要提升的流程,而不會激發UAC對話框。要做到這一點的唯一方法是啓動**您的**進程,以便它啓動的進程繼承該提升的令牌。 –

+0

@David - 我可能應該已經離開#1了,但這是我第一次遇到這樣一種情況,即可以從資源管理器中看到文件,但在使用ShellExecute()時無法找到,甚至從非 - 升高的命令提示符。我不確定自己是否從一開始就做錯了什麼,導致了對UAC的需求。 –

回答

6

而是管的結果QWINSTA.EXE必須使用Remote Desktop Services API Functions這個API的德爾福翻譯檢查JwsclTerminalServer單元這是JEDI的Windows安全代碼庫(JWSCL)的一部分。在你的情況下枚舉終端服務器見證,你可以使用TJwTerminalServer.EnumerateSessions方法。

+0

非常感謝! –

+0

Jedi JWSCL有許多很酷的功能。如果WMI提供了查詢終端服務器會話的方法,我也不會感到驚訝。 –

+0

@WarrenP,WMI有一套完整的類來訪問'root \ CIMV2 \ TerminalServices'命名空間中的終端服務,但不幸的是沒有關於這些類的官方文檔。因爲我只是在我的回答中提到終端服務API :) – RRUZ

相關問題