2015-12-08 86 views
-1

我有一個服務應用程序。在這項服務中,我想爲我的用戶在註冊表中訪問存儲在CURRENT_USER部分下的值。在我看來,這樣做的方法是將服務與當前用戶帳戶關聯,我瞭解該服務默認以SYSTEM用戶訪問權限運行。通過Windows服務獲取用戶訪問權限?

我在Windows服務管理器的服務屬性下找到了服務登錄選項卡,所以我很確定有一個API可以做我想做的事情。如何在代碼中將服務關聯到我的用戶?

+1

通過CreateService()的lpServiceStartName參數註冊服務時,可以將該服務與用戶帳戶相關聯。一旦註冊,就沒有API可以更改用戶,只能在SCM用戶界面中完成。 –

+0

@Remy,你可以使用ChangeServiceConfig()。 –

+0

但是OP可能會更好地咬住子彈並將設置移動到HKEY_LOCAL_MACHINE。 –

回答

0

您對您需要做什麼的分析完全不符合多用戶系統的實際情況。

考慮一臺機器有兩個普通用戶A和B的情況。用戶A在早上使用機器,然後註銷。用戶B在午餐後登錄並在當天剩餘時間使用本機。設置服務的登錄詳細信息時,必須指定服務的單個用戶。但是你選擇A還是B?

它變得更糟。上面的場景在任何時候都有一個用戶登錄。但是,多個用戶同時登錄到機器是完全可能的。你想要哪一個?推測是積極的。但是,如果機器正在運行終端服務並且多個用戶同時處於活動狀態呢?

忽略了終端服務的問題,只考慮第一種情況,你可以做到以下幾點:

  1. 找到活動會話,並找到與該會話關聯的用戶。
  2. 找到該用戶的SID。
  3. HKEY_USERS閱讀該SID的相應配置單元。

但是,我想知道這是否真的是你想要做的。我的猜測是,無論您遇到什麼問題,您的問題都有更好的解決方案。但我不想在不知道問題出在哪裏的情況下推測更好的解決方案。

最後,SYSTEM帳戶是機器上功能最強大的帳戶。出於安全原因,建議您不要在該帳戶下運行您的服務,除非有充分理由這樣做。你真的需要使用這個帳戶嗎?

+0

問題:該服務在多個專用主機上運行,​​以處理性能繁重的計算任務。處理這些任務的軟件受許可證保護。許可證以用戶級別存儲在註冊表中,以便將每個許可證密鑰與用戶相關聯。我一直無法從服務中訪問這部分註冊表中的許可證密鑰,導致我無法啓動處理軟件。 –

+0

我們討論過的解決方案是將服務與專用用戶相關聯,這就是我的問題。我自己對此解決方案並不滿意,所以我對更好地解決問題的建議非常感興趣 –

+1

不是直接訪問HKEY_USERS,而是讓服務找到所需的用戶會話,獲取其用戶令牌並模擬該用戶,然後使用RegOpenCurrentUser()打開該用戶的HKEY_CURRENT_USER配置單元。或者,一旦擁有用戶令牌,可以使用CreateProcessAsUser()在用戶會話中運行進程,然後讓該進程訪問HKEY_CURRENT_USER並根據需要將數據發回服務。 –

0

好吧,首先,我建議通過一些關於Windows服務編程的MSDN文章。所羅門的文章& Russinovich是一個好的開始。

第一件事 - 服務應該是「無人值守」。如果你想有一個服務與用戶無論如何互動,有幾個方法:

  • 下特定的用戶憑據運行服務
  • 創建可運行通過用戶UI

方法各有利弊。在特定用戶憑據下運行意味着需要一些管理工作。在某些情況下,這可能很容易,在某些公司的新產品中可能會很痛苦。 用戶應用程序是另一種方式。想想任何一個,比如說你在圖標托盤中的DB管理控制檯。而已。數據庫作爲服務運行,並且您擁有用戶應用程序。這有點額外的工作,但另一方面,您可以更好地將服務功能與對此功能的實際控制分離,這可能會在多用戶環境中按用戶進行。