获得当前进程所有者的信息

类别:VC语言 点击:0 评论:0 推荐:

主要设计代码如下:

#include <tlhelp32.h>

 

.......

 CListCtrl m_strList;
 CString m_strValue;

.......

//获取当前进程的所有者的信息

void OnGetUser()
{
 // TODO: Add your control notification handler code here
 UpdateData();
 if(m_strValue.IsEmpty())
 {
  AfxMessageBox(_T("Process Id is empty!"));
  return ;
 }
 int nId = atol(m_strValue);

 CString str;

 GetProcessAuth(str, nId);
 if(strPathValid.IsEmpty())
 {
  AfxMessageBox(_T("Get the path Failed!"));
 }
 else
 {
  AfxMessageBox(strPathValid);
 }
}

//读取当前进程的所有者的信息

void GetProcessAuth(CString strPath,long pid)
{
 //获得运行进程的用户身份,此处对于8以上的进程没问题,对于8,0进程无法列出(8是Win2000下的,WinXP下为4)
 SID_NAME_USE peUse;
 HANDLE hp;
 HANDLE hToken;
 int isok;
 char buf[0x400];
 char buf1[100];
 char buf2[100];
 DWORD dwNumBytesRet;
 DWORD dwNumBytesRet1;

 hp=OpenProcess(0x400, 0, pid);//0x400 is PROCESS_QUERY_INFORMATION
 isok=OpenProcessToken(hp, 0x20008, &hToken);//这个0x20008不知道什么,TOKEN_QUERY?
 if(isok)
 {
  isok=GetTokenInformation(hToken, TokenUser, &buf, 0x400, &dwNumBytesRet);
  if(isok)
  {
   dwNumBytesRet=100;
   dwNumBytesRet1=100;
   isok=LookupAccountSid(NULL, (DWORD *) (*(DWORD *)buf), buf1, &dwNumBytesRet, buf2, &dwNumBytesRet1, &peUse);
   if(isok)
   {
    strPath.Format("Run Auth:%s\\%s", buf2, buf1);
    strPathValid = strPath;
   }

   CloseHandle(hToken);
  }
 }

 CloseHandle(hp);
}

//获取当前的进程列表

void ListProcess()
{
 m_strList.DeleteAllItems();
 while(m_strList.DeleteColumn(0));
 m_strList.ModifyStyle(0,LVS_REPORT);
 m_strList.InsertColumn(0,"进程ID",LVCFMT_LEFT,80);
 m_strList.InsertColumn(1,"进程名称",LVCFMT_LEFT,150);
 HANDLE handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 
 PROCESSENTRY32* info=new PROCESSENTRY32;
    info->dwSize=sizeof(PROCESSENTRY32);
    int i=0;
 if(Process32First(handle,info))
 {
  if(GetLastError()==ERROR_NO_MORE_FILES )
  {
   AfxMessageBox("No More Process");
  }
  else
  {
   CString id;
   id.Format("%d",info->th32ProcessID);
   
   m_strList.InsertItem(i,id);
   m_strList.SetItemData(i,info->th32ProcessID);
   id.Format("%s",info->szExeFile);
   m_strList.SetItemText(i,1,id);
   i++;

   while(Process32Next(handle,info)!=FALSE)
   {
    id.Format("%5d",info->th32ProcessID);
   
    m_strList.InsertItem(i,id);
    m_strList.SetItemData(i,info->th32ProcessID);
    id.Format("%s",info->szExeFile);
    m_strList.SetItemText(i,1,id);
    i++;
   }
  }
 }
   CloseHandle(handle);
  
   delete info;
}

//获取点击list的进程的进程标识

void CGetProcessUserMfcDlg::OnClickListctrl(NMHDR* pNMHDR, LRESULT* pResult)
{
 // TODO: Add your control notification handler code here
 POSITION pos = m_strList.GetFirstSelectedItemPosition();
 int select=m_strList.GetNextSelectedItem(pos);
 SetDlgItemInt(IDC_PROCESS_ID,m_strList.GetItemData(select)); 
 *pResult = 0;
}

本文地址:http://com.8s8s.com/it/it894.htm