共用方式為


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

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_CONSOLE_DISCONNECT
  • WTS_REMOTE_CONNECT
  • WTS_REMOTE_DISCONNECT
  • WTS_SESSION_LOGOFF
  • WTS_SESSION_LOGON

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

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

重要

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

 

確保應用程式只有一個實例正在執行

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

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

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

應用程式可能需要在所有工作階段之間自行關閉。 例如,同時在兩個或多個會話中執行的應用程式,可能會從 Web 下載新的檔案。 然後,可能需要關閉本身,並使用更新的位重新啟動。 當然,這必須在所有執行中的會話中完成。 您應該撰寫您的應用程式,以便在收到通知時清除它。

與系統服務的互動

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

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

    在此情況下,訊息可能會使用本機過程調用 (LPC) 或遠端過程調用 (RPC) 傳輸。 LPC 或 RPC 有一個 API,可讓您擷取用戶端令牌。 取得用戶端令牌之後,伺服器就可以在呼叫 CreateProcessAsUser 時使用它。 這會在正確的視窗站台上顯示進程,假設用戶端使用者令牌具有會話標記,因此應該如此。

    注意

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

     

  • 伺服器進程會收到通知,而且需要顯示UI,但顯示器不必位於目前用戶的內容中。

    在此情況下,伺服器進程可以複製其主要進程令牌,並變更有問題的會話標識碼以符合目前的會話標識碼。 您可以使用 WTSGetActiveConsoleSessionId 函式來取得目前的會話識別碼。

    注意

    若要設定令牌會話標識碼,您需要 SE_TCB_PRIVILEGE。 您只會將此項目作為在 NT AUTHORITY\SYSTEM 中執行的服務。

     

遠端桌面和頻寬

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