1. 程式人生 > >如何在system程序下模擬administrator程序呼叫windowsAPI

如何在system程序下模擬administrator程序呼叫windowsAPI

我們新建了一個網路對映,現在需要在我們的服務程序中訪問這個遠端磁碟,結果發現QueryDosDevice、NetUseEnum、GetLogicalDriveStrings均不可用。怎麼辦?

因為磁碟對映是和當前賬戶關聯的,當賬戶登入之後才會存在這個碟符。(可以試試在同一個系統上建立兩個賬戶,它們可以將不同的網路位置對映成同一個碟符。當然碟符只是一個邏輯符號,系統正真的符號是\Device\Mup和\Device\LanmanRedirector 的UNC形式標識,這樣系統內部是不會重複的)。

我們的磁碟對映是Administrator賬戶建立的,而服務程序是SYSTEM賬戶。試了好多種方法都沒有解決如何高效的在SYSTEM賬戶下的訪問遠端磁碟。

於是想能不能在SYSTEM賬戶下模擬Administrator的賬戶訪問呢,問了公司的大神後覺得可行。就上網查詢相關的資料。順便這裡記錄一下以備以後檢視。

方法如下:

  • 1.得到當前登入使用者的Token。

    WTSGetActiveConsoleSessionId()

    WTSQueryUserToken()

  • 2.模擬當前登入使用者

    ImpersonateLoggedOnUser()

  • 3.接下來可以使用本地磁碟的函式進行操作了

    。。。。。。。。。

  • 4.操作完成之後別忘了RevertToSelf。再換回SYSTEM。

程式中的程式碼:

標頭檔案

?
1 2 #include <Wtsapi32.h> #pragma comment(lib, "Wtsapi32.lib")

1.如果當前賬戶是SYSTEM,需要切換到當前啟用賬戶的環境來執行

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 HANDLE hTokenUser = NULL; DWORD ConsoleSessionId = 0; BOOL bImpersonateLoggedOnUser = FALSE; char userName[256] = {0};
DWORD userNameLen = sizeof(userName); GetUserName(userName, &userNameLen); if (0 == stricmp("SYSTEM", userName)) { // 得到當前啟用使用者的會話ID ConsoleSessionId = WTSGetActiveConsoleSessionId(); // 得到當前登入使用者的令牌 if (WTSQueryUserToken(ConsoleSessionId, &hTokenUser)) { // 模仿成當前登入使用者 bImpersonateLoggedOnUser = ImpersonateLoggedOnUser(hTokenUser); } }

2.用完後

?
1 2 3 4 5 // 終止模擬,返回 if (bImpersonateLoggedOnUser) { RevertToSelf(); }

注意事項:

1.該功能可能不支援Win2003以下版本的系統,我還沒測試。

2.這裡說的當前登入使用者指的是哪個使用者?看MSDN上的這一段話:

The session identifier of the session that is attached to the physical console. If there is no session attached to the physical console, (for example, if the physical console session is in the process of being attached or detached), this function returns 0xFFFFFFFF.

參考資料:

===============================

2014-11-26更新:

接受老大的建議:上述程式碼中有一處不嚴謹。判斷是否有SYSTEM許可權比判使用者名稱更好

判斷程式碼如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 BOOL CurrentUserIsLocalSystem() { BOOL bIsLocalSystem = FALSE; PSID psidLocalSystem; SID_IDENTIFIER_AUTHORITY ntAuthority = SECURITY_NT_AUTHORITY; BOOL fSuccess = ::AllocateAndInitializeSid(&ntAuthority, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &psidLocalSystem); if (fSuccess)  { fSuccess = ::CheckTokenMembership(0, psidLocalSystem, &bIsLocalSystem); ::FreeSid(psidLocalSystem); } return bIsLocalSystem; }

參考資料:

相關推薦

如何在system程序模擬administrator程序呼叫windowsAPI

我們新建了一個網路對映,現在需要在我們的服務程序中訪問這個遠端磁碟,結果發現QueryDosDevice、NetUseEnum、GetLogicalDriveStrings均不可用。怎麼辦? 因為磁碟對映是和當前賬戶關聯的,當賬戶登入之後才會存在這個碟符。(可以試試在同一個系統上建立兩個賬戶,它們可以將

Windows獲取Dump檔案以及程序各執行緒呼叫棧的方法總結

【除錯死鎖】1、!syncblk,檢視哪些執行緒拿到了鎖2、~67e!clrstack 跳到某個拿到鎖的執行緒看它正在幹什麼操作,遲遲不肯釋放鎖3、!runaway 檢視這個佔有鎖的執行緒運行了多長時間。4、~*e!clrstack檢視所有執行緒的託管堆疊,看看哪些是正在等待鎖的,比如hang在System.

qt的時鐘程序(簡單美麗,繼承自QWidget的Clock,用timer調用update刷新,然後使用paintEvent作畫就行了,超詳細中文註釋)good

循環 連接 定位 根據 定時器 img cal widget tran 最近抽空又看了下qt,發現用它來實現一些東西真的很容易比如下面這個例子,繪制了個圓形的時鐘,但代碼卻清晰易懂[例子源自奇趣科技提供的例子]因為清晰,所以就只寫註釋了,吼吼其實也就這麽幾行代碼頭文件 /

自己主動化測試程序之中的一個自己定義鍵盤的模擬測試程序(C語言)

nds per oid 尾指針 應用 tro scan number 實現 一、測試程序編寫說明 我們做的終端設備上運行的是QT應用程序。使用自己定義的鍵盤接口。經過測試人員長時間的人機交互測試,來確認系統的功能是否滿足需求。如今須要編寫一個自己主動化

以Linux的測試程序說明遞歸型互斥量和普通互斥量的區別

lib 檢查 字符串 每次 情況 執行 test cpp 遞歸 先貼代碼和測試結果 // Mutex.h: 對pthread的互斥量的RAII包裝 #ifndef _MUTEX_H_ #define _MUTEX_H_ #include <stdio.h>

u-boot延時程序失效的bug調試

val boot 結果 dump pre spa quest pri 默認 最近在工作中的一個項目中,大概是將兩塊板卡相連(一塊STM32跑裸機程序,另一塊AM335x跑Linux系統),但是發現在u-boot有時無法啟動成功,需要通過一個GPIO的狀態來判斷,具體來說就是

python小程序模擬用戶登陸系統)

賬號 this src 使用 div [0 please one str 模擬登陸1.用戶輸入賬號密碼進行登陸2.用戶信息存在文件內3.用戶密碼輸錯三次後鎖定用戶 知識點:strip()、split()、while、for循環混用以及布爾值的使用 strip() 方法用於

gcc和MinGW的異同(在cygwin/gcc做的東西可以無縫的用在linux,沒有任何問題,是在windows開發linux程序的一個很好的選擇)

實現 o-c tool 交叉 lin 分析 模擬 gcc編譯器 還要 cygwin/gcc和MinGW都是gcc在windows下的編譯環境,但是它們有什麽區別,在實際工作中如何選擇這兩種編譯器。 cygwin/gcc完全可以和在linux下的gcc化做等號,這個可以從bo

LinuxPCI設備驅動程序開發 --- PCI驅動程序實現(三)

傳輸 char rep roc register case 負責 ava b- 三、PCI驅動程序實現 1. 關鍵數據結構 PCI設備上有三種地址空間:PCI的I/O空間、PCI的存儲空間和PCI的配置空間。CPU可以訪問PCI設備上的所有地址空間,其中I/O空間和存儲空間

微信小程序拉按鈕動畫

images 技術 技術分享 alt 一個 .cn ges 執行 動態切換 有些時候要求下拉按鈕需要動畫效果,但又不需要引入插件. 這時需要手動寫一個動畫. 主要思路:   動態切換class   默認與動畫轉向的樣式編寫 上圖是默認給出的按鈕向下的樣式, 上圖是動畫轉

程序拉刷新

view 格式 img width ges 自帶 style ref 回調   1、通過scroll-view實現   開始用scroll-view組件,通過scroll-view自帶的觸發下拉刷新、上拉加載事件。   在iOS下,可以正常觸發,但在安卓機型下,必須先上滑一

用VS2012或VS2013在win7編寫的程序在XP運行就出現“不是有效的win32應用程序

font log cnblogs 找不到 gpo pro span pla 5.1 問題描述: 用VC2013編譯了一個程序,在Windows 8、Windows 7(64位、32位)下都能正常運行。但在Win XP,Win2003下運行時,卻報錯不能運行,具體錯誤信息為“

在 root 執行 Oracle 程序時找不到 libclntsh.so.11.1 錯誤的解決辦法。

gpo blog body 解決辦法。 usr bsp nts export bho 在 root 下執行 Oracle 程序時找不到 libclntsh.so.11.1 錯誤的解決辦法。 先確定 libclntsh.so.11.1 所在目錄: [oracle@loca

windows啟動某程序提示缺失**.dll文件的處理方法

tex under window text clas dll files pos mfc 一.背景: 1.os : windows7 64bit 旗艦版 2.啟動ftp服務端軟件時提示缺失mfc100.dll文件 以上情形親測有效 二.修復 2.1 從https://cn.

Linux環境編寫C程序

gcc gdb Linux環境下編寫包括頭文件C程序出 一:gcc編譯鏈接用法:gcc [選項] 文件...選項:-pass-exit-codes 在某一階段退出時返回最高的錯誤碼--help 顯示此幫助說明--target-help

微信小程序訂單插件(日歷)

用戶體驗 scroll col itl ice his 創建 rst 小程序開發 最近做小程序開發,出於練手,也是工作需要,就做了個微信小程序的類似於酒店預訂的日歷插件。先上圖; 這個插件分為上下兩部分,上邊是tab欄,會根據當前的日期自動定位到當前,並展示以後7天的日

如何配置任意目錄Web應用程序

ava 。。 應用 post Language pro 地址 first too 1,首先創建一個Web項目,tomcat 7, JDK 1.8 2,創建Web項目並部署到tomcat服務器下運行的步驟和方法: 在Eclipse下創建一個JAVA project 在JA

微信小程序拉刷新和上拉加載的實現

keyword this navig comm com DC 程序 小程序 ati 一: 下拉刷新 下拉刷新兩個步驟就能實現。 1.在要實現下拉刷新的頁面的json配置文件裏面加上 "enablePullDownRefresh": true, //開啟下拉刷新 "back

【小程序模擬請求加載數據(本地數據(無服務器))

數據接口 OS ddr list 一個 src http data 使用 1.新建一個data文件夾,*-data.js的數據格式如下圖, 並且給腳本文件定義出口 module.exports = { postList : local_database //外部訪

程序拉加載動畫問題

加載動畫 動畫 text ace load ati ext art 即使 原先自己一直納悶為什麽沒有三個小圓點的動畫,而只有頂部旁邊的navigationBarTitleText轉圈圈。 以上效果是因為下拉事件的wx.showNavigationBarLoading() ,