现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

获取所有进程的用户名

2012-08-15 23:41 工业·编程 ⁄ 共 5979字 ⁄ 字号 暂无评论

以下代码实现获取某个进程所属的用户名,比如RavMonD.exe的进程PID是1300,那么修改这条语句就OK
GetProcessUser(1300,&bs);它的获取结果是:SYSTEM。
-----------------------------------------------------
#include <windows.h>
#include <iostream.h>
#include <COMDEF.H>
#include <stdio.h>
typedef struct _UNICODE_STRING {
         USHORT Length;        
         USHORT MaximumLength;
         PWSTR   Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
//SystemProcessInformation
typedef struct _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(CHAR * pDllName, CHAR *pProcName)
{
     HMODULE         hMod;
     hMod = LoadLibraryA(pDllName);
     if(hMod == NULL)
         return NULL;
     return GetProcAddress(hMod, pProcName);
}
//宏定义函数的指针
typedef LONG (WINAPI *Fun_NtQuerySystemInformation) (int   SystemInformationClass, 
                                                                                             OUT PVOID SystemInformation, 
                                                                                             IN ULONG SystemInformationLength, 
                                                                                             OUT ULONG * pReturnLength OPTIONAL);
typedef BYTE (WINAPI *Fun_WinStationGetProcessSid)(HANDLE hServer,DWORD   ProcessId ,

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("NTDLL.DLL", "NtQuerySystemInformation");
     if(_NtQuerySystemInformation == NULL)
         return FALSE;
     DWORD         dwSize = 1024*1024;
     VOID         * pBuf = NULL;
     LONG         lRetVal;
     for(;;)
     {
         if(pBuf)
             free(pBuf);
         pBuf = (VOID *)malloc(dwSize);
         lRetVal = _NtQuerySystemInformation(SystemProcessInformation,
             pBuf, dwSize, NULL);
         if(STATUS_INFO_LENGTH_MISMATCH != lRetVal)
             break;
         dwSize *= 2;
     }
     if(lRetVal == 0)
     {
         *ppSysProcInfo = (SYSTEM_PROCESS_INFORMATION *)pBuf;
         return TRUE;
     }
     free(pBuf);
     return FALSE;
}
BOOL GetProcessUser(DWORD dwPid, _bstr_t *pbStrUser)
{         Fun_WinStationGetProcessSid         _WinStationGetProcessSid;
     Fun_CachedGetUserFromSid         _CachedGetUserFromSid;
     _WinStationGetProcessSid = (Fun_WinStationGetProcessSid)
         GetDllProc("Winsta.dll", "WinStationGetProcessSid");
     _CachedGetUserFromSid = (Fun_CachedGetUserFromSid)
         GetDllProc("utildll.dll", "CachedGetUserFromSid");
     if(_WinStationGetProcessSid == NULL || _CachedGetUserFromSid == NULL)
         return FALSE;
     BYTE         cRetVal;
     FILETIME     ftStartTime;
     DWORD         dwSize;
     BYTE         * pSid;
     BOOL         bRetVal, bFind;
     SYSTEM_PROCESS_INFORMATION     *     pProcInfo, * pCurProcInfo;
     bRetVal = GetSysProcInfo(&pProcInfo);
     if(bRetVal == FALSE || pProcInfo == NULL)
         return FALSE;
     bFind = FALSE;
     pCurProcInfo = pProcInfo;
     for(;;)
     {
         if(pCurProcInfo->dwProcessId == dwPid)
         {
             memcpy(&ftStartTime, &pCurProcInfo->qCreateTime, sizeof(ftStartTime));
             bFind = TRUE;
             break;
         }
         if(pCurProcInfo->dwNextEntryOffset == 0)
             break;
         pCurProcInfo = (SYSTEM_PROCESS_INFORMATION *)((BYTE *)pCurProcInfo +
             pCurProcInfo->dwNextEntryOffset);
     }
     if(bFind == FALSE)
     {
         free(pProcInfo);
         return FALSE;
     }
     cRetVal = _WinStationGetProcessSid(NULL, dwPid, ftStartTime, NULL, &dwSize);
     if(cRetVal != 0)
         return FALSE;
     pSid = new BYTE[dwSize];
     cRetVal = _WinStationGetProcessSid(NULL, dwPid, ftStartTime, pSid, &dwSize);
     if(cRetVal == 0)
     {
         delete [] pSid;
         return FALSE;
     }
     WCHAR   szUserName[1024];
     dwSize = 1024;
     _CachedGetUserFromSid(pSid, szUserName, &dwSize);
     delete [] pSid;
     if(dwSize == 0)
         return FALSE;
     *pbStrUser = szUserName;
     return TRUE;
}
int main()
{
         char ch[256] = {0};
         _bstr_t bs;
         memcpy(&bs,ch,sizeof(bs));
         GetProcessUser(1300,&bs); //第一个参数写的是你的进程ID
         printf(bs);
         printf("/n");
         return 0;
}

给我留言

留言无头像?