#include " stdafx.hを" の#include <windows.hに> する#include <iostreamの> の#include <COMDEF.H> 書式#include <stdio.hに> する#include <Tlhelp32.h> 使用して 名前空間はstd; typedefは構造体_UNICODE_STRING { ; USHORT長 USHORT MaximumLength; PWSTRバッファー; } UNICODE_STRING、 * PUNICODE_STRING。 // SystemProcessInformation のtypedef 構造体_SYSTEM_PROCESS_INFORMATION { DWORD dwNextEntryOffset。 DWORD dwNumberOfThreads; LARGE_INTEGER qSpareLi1; LARGE_INTEGER qSpareLi2; LARGE_INTEGER qSpareLi3; LARGE_INTEGER qCreateTime; LARGE_INTEGER qUserTime; LARGE_INTEGER qKernelTime; UNICODE_STRING imagenameの; int型 nBasePriority; DWORD dwProcessId; DWORD dwInheritedFromUniqueProcessId; DWORD dwHandleCount; DWORD dwSessionId; ULONG dwSpareUl3; SIZE_T tPeakVirtualSize; SIZE_T tVirtualSize; DWORD dwPageFaultCount; DWORD dwPeakWorkingSetSize; DWORD dwWorkingSetSize; SIZE_T tQuotaPeakPagedPoolUsage; SIZE_T tQuotaPagedPoolUsage; SIZE_T tQuotaPeakNonPagedPoolUsage; SIZE_T tQuotaNonPagedPoolUsage; SIZE_T tPagefileUsage; SIZE_T tPeakPagefileUsage; SIZE_T tPrivatePageCount; LARGE_INTEGER qReadOperationCount; LARGE_INTEGER qWriteOperationCount; LARGE_INTEGER qOtherOperationCount; LARGE_INTEGER qReadTransferCount; LARGE_INTEGER qWriteTransferCount; LARGE_INTEGER qOtherTransferCount; } SYSTEM_PROCESS_INFORMATION。 / * --------------------------------------------- ------- 機能の説明:動的動的ライブラリファイルの読み込み pDllNameライブラリファイル名、pProcNameエクスポート機能名:入力パラメータ 出力パラメータ:なし 戻り値:関数のアドレスを返します ----------- -------------------------------------------------- * / VOID * GetDllProc(のconst TCHAR * pDllName、CONST CHAR * pProcName) { HMODULE HMOD; HMODは = のLoadLibrary(pDllName)を、 IF(HMOD == NULL) 戻りNULL; 返す(HMOD、pProcName)のGetProcAddressを; } //宏定义函数的指针 typedefのLONG(WINAPI * Fun_NtQuerySystemInformation)(int型 SystemInformationClassを、 OUT PVOID SystemInformation、 ULONG SystemInformationLengthでは、 ULONG OUT * pReturnLengthオプション)。 typedefをBYTE(WINAPI * Fun_WinStationGetProcessSid)(hServer、DWORD PROCESSID、HANDLE FILETIME PROCESSSTARTTIME、PBYTE pProcessUserSid、PDWORD dwSidSizeを)。 typedef VOID(WINAPI * Fun_CachedGetUserFromSid)(PSIDとPSID、PWCHAR pUserName、PULONG cbUserName)。 #define STATUS_INFO_LENGTH_MISMATCH((LONG)0xC0000004L)の#define SystemProcessInformation 5 / * -------------------------------------------------- ---------------- 機能説明:情報処理システムを取得 SYSTEM_PROCESS_INFORMATIONの:入力パラメータ 出力パラメータを:なし ------------------ -------------------------------------------------- * / BOOL GetSysProcInfo(SYSTEM_PROCESS_INFORMATION * ppSysProcInfo) { Fun_NtQuerySystemInformation _NtQuerySystemInformation; _NtQuerySystemInformation =(Fun_NtQuerySystemInformation):: GetDllProc(TEXT(" NTDLL.DLL ")、" NtQuerySystemInformation " ); IF(_NtQuerySystemInformation == NULL) リターンFALSE; DWORD dwSize = 1024 * 1024 ; VOID * PBUF = NULL; LONG lRetVal; 一方、(真) { 場合(PBUF) フリー(PBUF)。 PBUF =(ボイド*)のmalloc (dwSize)。 lRetVal = _NtQuerySystemInformation(SystemProcessInformation、PBUF、dwSize、NULL); もし(!STATUS_INFO_LENGTH_MISMATCH = lRetVal) ブレーク。 dwSize * = 2 ; } 場合(lRetVal == 0 ) { * ppSysProcInfo =(SYSTEM_PROCESS_INFORMATION * )PBUF。 返すTRUE; } フリー(PBUF)。 返すFALSE; } BOOL GetProcessUser(DWORD dwPid、_bstr_t * pbStrUser) { Fun_WinStationGetProcessSid _WinStationGetProcessSid。 Fun_CachedGetUserFromSid _CachedGetUserFromSid; _WinStationGetProcessSid = (Fun_WinStationGetProcessSid) GetDllProc(TEXT(" Winsta.dll ")、" WinStationGetProcessSid ")。 _CachedGetUserFromSid = (Fun_CachedGetUserFromSid) GetDllProc(TEXT(" utildll.dll ")、" CachedGetUserFromSid " )。 もし(_WinStationGetProcessSid == NULL || _CachedGetUserFromSid == NULL) を返すFALSE; BYTE cRetVal; FILETIME ftStartTime; DWORD dwSize; BYTEの *のPSID。 BOOL bRetVal、bFind。 SYSTEM_PROCESS_INFORMATION * pProcInfo、* pCurProcInfo。 bRetVal = GetSysProcInfo(&pProcInfo)。 もし(bRetVal == FALSE || pProcInfo == NULL)を 返すFALSE。 bFind = FALSE; pCurProcInfo = pProcInfo。 用(;;) { 場合(pCurProcInfo-> dwProcessId == dwPid) { のmemcpy(&ftStartTime、&pCurProcInfo-> qCreateTime、はsizeof (ftStartTime))。 bFind = TRUE; 破ります; } であれば(pCurProcInfo-> dwNextEntryOffset == 0 ) ブレーク。 pCurProcInfo=(SYSTEM_PROCESS_INFORMATION *)((BYTE *)pCurProcInfo + pCurProcInfo - > dwNextEntryOffset)を、 } であれば(bFind == FALSE) { フリー(pProcInfo)。 返すFALSE; } cRetVal = _WinStationGetProcessSid(NULL、dwPid、ftStartTime、NULL、&dwSize)。 もし(!cRetVal = 0 ) を返すFALSE; PSID = 新しいBYTE [dwSize]。 cRetVal = _WinStationGetProcessSid(NULL、dwPid、ftStartTime、PSID、&dwSize)。 もし(cRetVal == 0) { 削除[] PSIDと、 返すFALSE; } WCHAR szUserName [ 1024 ]。 _CachedGetUserFromSid(PSID、szUserName、 &dwSize)。 削除[] PSIDを。 もし(dwSizeの== 0 ) を返すFALSE; * pbStrUser = szUserName。 返すTRUE; } ボイドAdjustPrivilege() { hTokenをハンドルと もし(!OpenProcessToken(GetCurrentProcess()、TOKEN_ADJUST_PRIVILEGES、&hToken)) { のprintf("OpenProcessTokenエラーの\ n " ); リターン; } LUID myLUID; LookupPrivilegeValue(NULL、SE_DEBUG_NAME、 &myLUID); TOKEN_PRIVILEGESのTP = { はsizeof (TP)}; tp.PrivilegeCount = 1 ; tp.Privileges [ 0 ] .Luid = myLUID。 tp.Privileges [ 0 ] .Attributes = SE_PRIVILEGE_ENABLED; もし(AdjustTokenPrivileges(hToken、FALSE、&TP、はsizeof (TP)、NULL、NULL)) { / * メッセージボックス(NULL、TEXT( "权限提升成功")、TEXT(」 「)、0); * / } CloseHandleを(hToken)。 } int型のmain() { TCHAR szProcessName [] = TEXT(" SERVICES.EXE " )。 BOOL bFind = FALSE; TCHARのCH [ 256 ] = { 0 }。 _bstr_t BS。 memcpy(&BS、CH、はsizeof (BS))。 PROCESSENTRY32のPE32; pe32.dwSize = はsizeof (PE32)。 HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS、0); // 获取进程快照 場合(hProcessSnap ==INVALID_HANDLE_VALUE) リターン falseに、 BOOL bResult = Process32First(hProcessSnap、およびPE32); AdjustPrivilege(); 一方(bResult) { GetProcessUser(804、&BS); bResult = Process32Next(hProcessSnap、およびPE32); } // GetProcessUser(PI。 th32ProcessID、&BS); // 最初のパラメータが書かれている、あなたのプロセスID }