簡體   English   中英

如何獲取CreateProcessAsUser的有效用戶令牌?

[英]How do I get a valid user token for CreateProcessAsUser?

我有一個以普通用戶身份運行的應用程序,以及作為本地系統運行的服務。 我希望應用程序能夠告訴服務再次啟動應用程序,一旦服務完成了其他一些事情。 (因此,當服務正在執行“事物”時,應用程序將不會運行。)為了使服務能夠以首次啟動它的用戶啟動應用程序,它需要一個用戶令牌。 應用程序在退出之前將令牌發送到服務,但是當服務嘗試使用它時,令牌/句柄無效。 (它首先使用DuplicateTokenEx來獲取主令牌。)

用戶令牌是否始終僅在調用OpenProcessToken的進程中有效?

還有其他方法可以做到嗎? 我不希望用戶必須使用logonuser“登錄”應用程序。 那只是愚蠢的。 我想我可以將“explorer.exe”的進程句柄從應用程序移交給服務,該服務可以用來獲取用戶令牌,但這需要PROCESS DUP HANDLE訪問權限。 我對這個解決方案並不感到興奮,但也許是這樣做的方法呢?

你在這里有多個問題,所以我會嘗試單獨解決它們,如果我誤解你可以糾正我:

  1. 您似乎擁有一個服務和一個無法同時執行某些功能的用戶應用程序。 為了實現這一點,您可以讓服務停止應用程序,執行特殊功能,然后重新啟動應用程序。 如果這是正確的,那么在我看來,你有一個設計缺陷。 而不是停止,然后重新啟動應用程序,您應該使用命名的互斥鎖和/或使用IPC方法(如命名管道)來協調對共享資源的訪問,以傳達意圖。

  2. 用戶令牌是否始終僅在調用OpenProcessToken的進程中有效? 是的,您收到的令牌句柄是進程句柄表的索引,它不能直接轉移。 您需要使用DuplicateHandle,這可能是您想要的,但可能會很混亂。

  3. 您希望找到獲取用戶令牌以將應用程序啟動到用戶(交互式?)會話的最佳方法。 如果是這種情況,最好的方法是檢索用戶的會話令牌並使用它。 您可以查看本文和示例代碼,它位於C#中,但應該相對容易轉換為您選擇的語言。

編輯:更新以包括Windows 2000.由於您在SYSTEM帳戶下運行服務,它可以打開進程本身的句柄(如果有必要,進程可以發送其進程ID)。 然后,它可以打開附加到該進程的令牌,復制它並使用生成的令牌啟動(或重新啟動)目標應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM