共用方式為


具有快速用戶切換和遠端桌面的用戶帳戶

Windows XP 使用者帳戶可讓多個用戶同時登入,每個使用者都有自己的設定,以及執行自己的應用程式。 因為一位使用者不需要註銷即可讓其他使用者存取,所以每位使用者都可以透過快速使用者切換功能輕鬆地存取桌面。 用戶帳戶也包含個人終端機伺服器功能或遠端桌面,可讓使用者從遠端系統存取其桌面帳戶。

以下主題將被討論。

基礎結構使用需求

繼承自 Windows 2000 的基礎基礎結構支援用戶數據、使用者設定和電腦設定的狀態區隔。 利用此基礎結構,您需要以下項目來確保您的應用程式能在 Windows XP 下成功執行。

  • 默認為 [我的檔] 資料夾,以儲存使用者建立的數據。
  • 正確分類和儲存應用程式數據。
  • 在「拒絕存取」訊息上優雅地降級。

暫存檔、記憶體對應檔案和文件都應儲存在使用者個人資料夾的適當子目錄中。 使用 SHGetFolderLocationSHGetFolderPath 來判斷這些檔案的適當儲存位置。 將 CSIDL_APPDATA 旗標傳遞至這些函式,會傳回檔系統目錄的路徑,做為應用程式特定數據的通用存放庫。 針對使用者變更時應該變更的數據,使用旗標 CSIDL_LOCAL_APPDATA 取代 CSIDL_APPDATA,例如臨時檔。

上述需求是Microsoft認證計劃中這些需求子集。 如需詳細資訊,請參閱 Windows 傳統型應用程式的 認證需求 頁面。

與現有應用程式的相容性

快速使用者切換和個人終端機伺服器都使用終端機服務技術,因此與大多數舊版 Microsoft的 Win32 應用程式相容。 如果應用程式符合 Windows 2000 標誌規範,並實現基本的用戶配置分離和電源管理功能,則該應用程式應該能夠在 Windows XP 的個別使用者帳戶下正確執行。

註冊會話切換通知

一般而言,應用程式不需要在切換桌面時收到通知。 不過,當應用程式執行所在的帳戶是目前正在使用的桌面時,且必須被通知,例如存取序列埠或其他共用資源的應用程式,可以註冊以接收桌面切換通知。 若要註冊通知,請使用 WTSRegisterSessionNotification 函式。

呼叫該函式之後,會註冊具有句柄 hWnd 的視窗,透過其 WndProc 函式接收 WM_WTSSESSION_CHANGE 訊息。 會話標識碼會在 lParam 參數中傳送,而表示產生訊息的事件的程式碼會以下列其中一個旗標傳送 wParam

  • WTS_CONSOLE_CONNECT
  • WTS_控制台_斷開連接
  • WTS_遠端連接
  • WTS_REMOTE_DISCONNECT
  • WTS_會話_登出
  • WTS_工作階段_登入

應用程式可以使用此訊息來追蹤其狀態,以及釋放並取得主控台特定資源。 使用者桌面可以在遠端和控制台控件之間動態切換。 應用程式應該使用 WM_WTSSESSION_CHANGE 訊息來與遠端或本機連線狀態同步處理。

當您的程式不再需要這些通知或正在終止時,它應該呼叫 WTSUnRegisterSessionNotification 取消註冊其通知。

重要

傳遞至 WTSRegisterSessionNotificationhWnd 值會進行參考計數,因此您必須對 WTSUnRegisterSessionNotification 進行相等的呼叫,以確保釋放所有已配置的資源。

 

确保應用程式只運行一個實例

許多應用程式都必須確保只有一個實例正在執行。 在 Windows XP 中,有數種方式可以執行這項作。 其中包括下列各項:

  • 使用 FindWindowFindWindowEx 來搜尋應用程式開啟的已知視窗。 如果該視窗已經開啟,您可以使用該視窗做為表示應用程式已在執行中。
  • 當您的應用程式開啟時,請建立 Mutex 或信號物件,並在應用程式終止時關閉該物件。 全域物件命名空間會針對每個桌面區隔,讓每個桌面都有唯一的 Mutex 和號誌物件清單。

在所有工作階段中關閉您的應用程式

應用程式可能需要在所有工作階段之間自行關閉。 例如,同時在兩個或多個會話中執行的應用程式,可能會從 Web 下載新的檔案。 然後,可能需要自動關閉並使用更新的部分重新啟動。 當然,這必須在所有進行中的會話中完成。 您應將應用程式設計為在接收到通知後能夠順利退出。

與系統服務的互動

從程序設計的觀點來看,必須解決下列情況。

  • 伺服器進程會從客戶端進程接收直接要求。

    在此情況下,訊息可能會使用本機過程調用 (LPC) 或遠端過程調用 (RPC) 傳輸。 LPC 和 RPC 都有各自的 API,可讓您擷取用戶端令牌。 取得用戶端令牌之後,伺服器就可以在呼叫 CreateProcessAsUser中使用它。 這會在正確的窗口站台上顯示程序,前提是用戶端令牌包含會話標籤,而它應該如此。

    注意

    CreateProcessAsUser 目前不支援跨會話處理繼承。

     

  • 伺服器程序會收到通知,並需要顯示使用者界面,但顯示的環境不必在當前使用者的上下文中。

    在此情況下,伺服器進程可以複製其主要進程令牌,並修改相關的工作階段識別碼,使其符合目前的工作階段識別碼。 您可以使用 WTSGetActiveConsoleSessionId 函式來取得目前的會話識別符。

    注意

    若要設定代幣工作階段識別碼,您需要 SE_TCB_PRIVILEGE。 您只會將此項目作為在 NT AUTHORITY\SYSTEM 中執行的服務。

     

遠端桌面和頻寬

透過將遠端桌面功能新增至 Windows XP,應用程式應該努力不要使用比所需的更多頻寬,避免在桌面遠端連線時使用廣泛的螢幕繪圖和動畫效果。 若要判斷目前的工作階段是否為遠端,您可以呼叫 GetSystemMetrics ,並使用 SM_REMOTESESSION。 不過請注意,此呼叫不會區分遠端和中斷連線。