新聞中心
技術(shù)介紹
CreateProcessAsUser是一個(gè)Windows API函數(shù),用于在指定用戶上下文中創(chuàng)建一個(gè)新的進(jìn)程,這個(gè)函數(shù)的原型如下:

為綠園等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及綠園網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、綠園網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
BOOL CreateProcessAsUser( HANDLE hToken, LPSECURITY_ATTRIBUTES lpSecurityAttrs, LPWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation );
參數(shù)說明:
hToken:目標(biāo)用戶的令牌,可以通過OpenProcessToken函數(shù)獲取。
lpSecurityAttrs:新進(jìn)程的安全屬性,可以設(shè)置為NULL。
lpApplicationName:要執(zhí)行的程序的名稱。
lpCommandLine:要執(zhí)行的程序的命令行參數(shù)。
lpProcessAttributes:新進(jìn)程的環(huán)境屬性,可以設(shè)置為NULL。
lpThreadAttributes:新進(jìn)程的主線程的安全屬性,可以設(shè)置為NULL。
bInheritHandles:是否繼承句柄,如果為TRUE,則新進(jìn)程將繼承父進(jìn)程的所有句柄;如果為FALSE,則新進(jìn)程將不繼承任何句柄。
dwCreationFlags:創(chuàng)建標(biāo)志,可以設(shè)置為0或CREATE_NEW_CONSOLE,表示創(chuàng)建一個(gè)新的控制臺(tái)窗口。
lpEnvironment:新進(jìn)程的環(huán)境變量,可以設(shè)置為NULL。
lpCurrentDirectory:新進(jìn)程的當(dāng)前目錄,可以設(shè)置為NULL。
lpStartupInfo:啟動(dòng)信息結(jié)構(gòu)體,包含新進(jìn)程的窗口樣式、大小、位置等信息。
lpProcessInformation:指向一個(gè)PROCESS_INFORMATION結(jié)構(gòu)體的指針,用于接收新進(jìn)程的信息。
使用方法示例
以下是一個(gè)使用CreateProcessAsUser函數(shù)創(chuàng)建一個(gè)新進(jìn)程的示例:
includeinclude include BOOL CreateProcessAsUser(HANDLE hToken, LPCWSTR lpApplicationName) { STARTUPINFOW si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); memset(&pi, 0, sizeof(pi)); si.cb = sizeof(si); if (!CreateProcessAsUser(hToken, NULL, L"C:\Windows\System32 otepad.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) { printf("CreateProcessAsUser failed (%d). Error: %lu ", GetLastError(), GetLastError()); return FALSE; } WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return TRUE; }
在這個(gè)示例中,我們使用CreateProcessAsUser函數(shù)以管理員權(quán)限運(yùn)行記事本程序,首先調(diào)用OpenProcessToken函數(shù)獲取管理員權(quán)限的令牌,然后調(diào)用CreateProcessAsUser函數(shù)創(chuàng)建新的進(jìn)程,最后等待新進(jìn)程結(jié)束并關(guān)閉相關(guān)句柄。
相關(guān)問題與解答
1、如何獲取其他用戶的令牌?可以使用OpenProcessToken函數(shù),傳入目標(biāo)進(jìn)程的句柄即可獲取該進(jìn)程的用戶令牌,示例代碼如下:
HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetProcessId); // 以目標(biāo)進(jìn)程的所有權(quán)限打開進(jìn)程句柄
HANDLE hToken = NULL; // 初始化令牌句柄為NULL
if (GetTokenInformation(hTargetProcess, TokenUser, &hToken, sizeof(hToken), TokenUser)) // 如果獲取成功,將令牌句柄賦值給hToken變量
{
TOKEN_USER tokenUser; // 定義TOKEN_USER結(jié)構(gòu)體變量tokenUser,用于接收令牌信息
memset(&tokenUser, 0, sizeof(tokenUser)); // 將tokenUser結(jié)構(gòu)體的內(nèi)存清零
if (GetTokenInformation(hToken, TokenUser, &tokenUser, sizeof(tokenUser), TokenUser)) // 如果獲取成功,將令牌信息賦值給tokenUser變量
{
HANDLE hNewToken = tokenUser.AuthenticationId; // 將新令牌句柄賦值給hNewToken變量
// 此時(shí)hNewToken即為其他用戶的令牌句柄,可以用于調(diào)用CreateProcessAsUser函數(shù)創(chuàng)建新進(jìn)程。
}
}
CloseHandle(hTargetProcess); // 關(guān)閉目標(biāo)進(jìn)程句柄和令牌句柄(如果有)
2、為什么需要使用CreateProcessAsUser而不是直接使用CreateProcess?直接使用CreateProcess無法指定運(yùn)行程序的用戶身份,而CreateProcessAsUser函數(shù)可以在指定用戶上下文中創(chuàng)建新的進(jìn)程,從而實(shí)現(xiàn)對(duì)程序運(yùn)行用戶身份的控制,在服務(wù)器端應(yīng)用程序中,可以將某些敏感操作委托給本地用戶來執(zhí)行,提高系統(tǒng)的安全性。
本文標(biāo)題:createprocessasuser怎么使用
地址分享:http://m.fisionsoft.com.cn/article/cdcedho.html


咨詢
建站咨詢
