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

类别:编程语言 点击: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/it25385.htm