虛擬當前使用者

2021-05-01 20:48:01 字數 2507 閱讀 6455

很多時候使用登錄檔操作是不安全的,因此很多重要的場合是不會使用登錄檔操作去達到目的的。但不可否認在很多小的地方,使用登錄檔操作是十分方便而 且直接有效的。有些內容的登錄檔操作時常會涉及到當前使用者的操作,在登錄檔中就體現在了hkey_current_user的子項上(系統通常情況下只具 有如下 hkey_classes_root,hkey_current_user,hkey_local_machine,hkey_users,hkey_current_config 五個子項)。

當我們需要進行登錄檔操作的應用程式以程序方式執行的時候,是不用擔心登錄檔操作失效的問題的。但是一旦應用程式以服務的方式啟動,那麼其針對 hkey_current_user下的子項操作就會出現問題,基本體現是功能失效,無法操作。這是因為應用程式以服務方式執行時無法針對某乙個當前使用者 操作。當然,如果這個登錄檔操作在hkey_local_machine項下可以完成,並能達到預期目的,我們就沒有必要大費周章了。

要使服務執行狀態下的應用程式通過登錄檔操作影響當前使用者的狀態,就必須在操作之前進行當前使用者的虛擬。一般來說我們可以通過如下兩個函式就可以實現了:

其中的api函式可能需要包含一些標頭檔案,比如tlhelp32.h和windows.h,如何還需要其他的可以自己去msdn上查;到了這一步虛 擬當前使用者算是成功了。不過impersonatecurrentuser這個函式大家可以發現,存在控制代碼沒有釋放,當然也不能釋放,如果釋放,虛擬就沒 有作用。但是一旦這種虛擬當前使用者在輪詢中出現,問題就出來了,會使應用程式產生很多的控制代碼並且拽著不放。

出現這種情況的話,我們可以改進impersonatecurrentuser函式,在應用程式進行登錄檔操作之前先建立乙個控制代碼,傳進 impersonatecurrentuser函式中,當登錄檔操作完成以後,再釋放。注意一點,釋放也就是殺掉控制代碼以後,不要忘記使用 reverttoself();  函式返回當前使用者

bool impersonatecurrentuser(handle &htoken)

ph =  openprocess(process_all_access, false, explorerpid);

if(!ph)

bret = openprocesstoken(ph, token_query|token_duplicate, &htoken); 

if(!bret)

bret = impersonateloggedonuser(htoken);

if(!bret)

closehandle(ph);

return bret;

}好像到了這一步就沒有問題了,其實不然,通過這些一般來說是可以了,但是有時候還是出現問題,登錄檔操作無效,主要還是應用程式以服務方式執行時找當前使用者的問題,也就是說到這一步還是不能確保正確。

要如何做才可以呢?在登錄檔中有這麼乙個根項hkey_users,它是用來管理系統所有使用者的,它的每乙個子項都對應系統的乙個使用者,這些子項名 稱可以看作時那些使用者的suid號。而hkey_users項是服務可以直接作用的,如果我們能找到當前使用者的suid,然後通過修改 hkey_users下該suid號下面對應的登錄檔項來達到本來的目的。因為hkey_users下當前使用者suid號對應的子項的登錄檔項和 hkey_current_user是完全相同並實時更新的,改動其中乙個就必然改動了另乙個,那麼解決方法就出來了。

bool  impersonatecurrentuser(std::string &sid)

ret = getusername(namebuf, &buflen);

if(!ret)

return false;

sid_name_use pnu;

ret = lookupaccountname(null, namebuf, (sid *)usid, &usidlen, domain, &udomainsidlen, &pnu);

if(!ret)

return false;

char *usidstr;

ret = convertsidtostringsida((sid *)usid, &usidstr);

if(!ret)

return false;

sid = usidstr;

localfree(usidstr);

closehandle(handle);

reverttoself();   //返回原來的使用者

return true;

}通過這個函式我們可以返回當前使用者的suid號,再通過操作hkey_users和這個suid號下對應的登錄檔項就可以達到我們的目的了。其實就 相當於來說把原來的登錄檔操作中的hkey_current_user給替換成hkey_users+suid。   注意,這個函式裡要使用到頭檔案sddl.h。

還是舉個例子來說吧,在程序中操作登錄檔項hkey_current_user/software/kingsoft/office/wps /addins/ksaddins.xdicthelper,我們就需要在服務中使用下面的鍵值了(hkey_users+suid)/software /kingsoft/office/wps/addins/ksaddins.xdicthelper。

wp 當前使用者 登入使用者

當前使用者 get currentuserinfo echo 使用者名稱 current user user login n echo 名字 current user user firstname n echo 姓氏 current user user lastname n echo 公開顯示名 c...

Linux 檢視當前使用者

一,w命令 該命令用於顯示登入到系統的使用者情況,w命令功能強大,它不但可以顯示有誰登入到系統,還可以顯示出這些使用者當前正在進行的工作,並且統計資料相對who命令來說更加詳細和科學.w命令的顯示專案按以下順序排列 當前時間,系統啟動到現在的時間,登入使用者的數目,系統在最近1秒 5秒和15秒的平均...

Spring security 獲取當前使用者

在頁面中引入標籤 1 taglibprefix sec uri 然後 1 username 2 如果要在程式中獲得 看了網上很多寫法都是在程式中寫這樣的 1 userdetails userdetails userdetails securitycontextholder.getcontext ge...