CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  API

关于进程调用者名称的问题,SID?

楼主zcsor(偶业余的虽然星星了,但是水平依然是非常业余的。)2006-06-02 22:16:33 在 VB / API 提问

已知一个进程的PID(WINDOWS任务管理器里的PID,也就是th32ProcessID),怎么能获取这个进程对应的用户名,WINDOWS任务管理器里面有的,例如我的任务管理器里现在进程标签下面有这样的显示  
   
   
  映像名称                 PID           用户名         CPU           内存使用  
  VB6.EXE                 2940           ISSOR           00             4,956   K  
   
  这里的用户名是怎么获取的?getprocessuser我试了,只能获取由SYSTEM和登陆名ISSOR所运行的程序,其他的无法获取。网上也看了一些帖子,都有这样的问题,有人建议用wtsapi32.dll的WTSEnumerateProcesses函数,但是我不知道怎么声明。  
   
  求代码,用getprocessuser,WTSEnumerateProcesses解决都可以,最好是后一个。代码测试通过马上给分。  
  最好是类似以下代码:  
  Private   Declare   Function   WTSEnumerateProcesses   Lib   "wtsapi32.dll"   (ByVal   ………………  
  private   function   GetProcessUserName(byval   PID   as   long)   as   string  
   
  end   function 问题点数:40、回复次数:10Top

1 楼lsftest()回复于 2006-06-03 13:06:20 得分 0

用wmi的win32_process类的GetOwner方法可通过进程的pid得到用户名....Top

2 楼ilove8(千里|你去哪里了,我等了你很久了!)回复于 2006-06-03 13:44:57 得分 0

upTop

3 楼verywzm(寒江雪)回复于 2006-06-03 14:55:49 得分 0

UPTop

4 楼zcsor(偶业余的虽然星星了,但是水平依然是非常业余的。)回复于 2006-06-03 18:08:15 得分 0

如何用API实现呢,你说的方法我不会,查了一下,似乎需要很多手工操作。。。。Top

5 楼zcsor(偶业余的虽然星星了,但是水平依然是非常业余的。)回复于 2006-06-03 18:56:54 得分 0

哪位把这些翻译一下啊,C2VB  
  //在psaipi.dll中的函数EnumProcesses用来枚举进程    
  typedef   BOOL   (_stdcall   *ENUMPROCESSES)(     //注意这里要指明调用约定为-stdcall  
    DWORD*   pProcessIds,     //指向进程ID数组链      
    DWORD   cb,         //ID数组的大小,用字节计数  
    DWORD*   pBytesReturned);       //返回的字节  
  //在psapi.dll中的函数EnumProcessModules用来枚举进程模块  
  typedef   BOOL   (_stdcall   *ENUMPROCESSMODULES)(  
    HANDLE   hProcess,       //进程句柄  
    HMODULE*   lphModule,   //指向模块句柄数组链  
    DWORD   cb,         //模块句柄数组大小,字节计数  
    LPDWORD   lpcbNeeded);       //存储所有模块句柄所需的字节数  
  //在psapi.dll中的函数GetModuleFileNameEx获得进程模块名  
  typedef   DWORD   (_stdcall   *GETMODULEFILENAMEEX)(  
    HANDLE   hProcess,       //进程句柄  
    HMODULE   hModule,       //进程句柄  
    LPTSTR   lpFilename,       //存放模块全路径名  
    DWORD   nSize         //lpFilename缓冲区大小,字符计算  
  );  
  Top

6 楼lsftest()回复于 2006-06-03 22:31:22 得分 40

如何用API实现呢,你说的方法我不会,查了一下,似乎需要很多手工操作。。。。  
  ===============================================  
  不,如果能用wmi一般都会比api简单,例如:  
   
  Private   Sub   Command1_Click()  
  strComputer   =   "."  
  Set   colProcesses   =   GetObject("winmgmts:"   &   _  
        "{impersonationLevel=impersonate}!\\"   &   strComputer   &   _  
        "\root\cimv2").ExecQuery("Select   *   from   Win32_Process")  
   
  For   Each   objProcess   in   colProcesses  
   
          Return   =   objProcess.GetOwner(strNameOfUser)  
          If   Return   <>   0   Then  
                  debug.print   "Could   not   get   owner   info   for   process   "   &   _      
                          objProcess.Name   &   VBNewLine   _  
                          &   "Error   =   "   &   Return  
          Else    
                  debug.print   "Process   "   _  
                          &   objProcess.Name   &   "   is   owned   by   "   _    
                          &   "\"   &   strNameOfUser  
  End   If  
  Next  
  End   Sub  
   
  没有vb,所以不能调试.....  
  系统要求xp以上.......Top

7 楼klever(klever)回复于 2006-06-04 08:19:57 得分 0

gzTop

8 楼zcsor(偶业余的虽然星星了,但是水平依然是非常业余的。)回复于 2006-06-04 21:28:34 得分 0

测试不能通过啊。。所以。。。分,给你了。。。呵呵,真的不能通过。Return   是VB的保留字,改成mReturn   就通过了。  
  发现一个问题。。。。  
  怎么给分啊。。怎么结帖啊,,,,,我是新新新新来的Top

9 楼zcsor(偶业余的虽然星星了,但是水平依然是非常业余的。)回复于 2006-06-04 21:28:58 得分 0

 
   
  Private   Sub   Command1_Click()  
   
  strComputer   =   "."  
  Set   colProcesses   =   GetObject("winmgmts:"   &   _  
        "{impersonationLevel=impersonate}!\\"   &   strComputer   &   _  
        "\root\cimv2").ExecQuery("Select   *   from   Win32_Process")  
   
  For   Each   objProcess   In   colProcesses  
   
          mReturn   =   objProcess.GetOwner(strNameOfUser)  
          If   mReturn   <>   0   Then  
                  Debug.Print   "Could   not   get   owner   info   for   process   "   &   objProcess.Name   &   vbNewLine   &   "Error   =   "   &   mReturn  
          Else  
                  Debug.Print   "Process   "   _  
                          &   objProcess.Name   &   "   is   owned   by   "   _  
                          &   "\"   &   strNameOfUser  
          End   If  
  Next  
   
  End   Sub  
  Top

10 楼zcsor(偶业余的虽然星星了,但是水平依然是非常业余的。)回复于 2006-06-04 21:30:30 得分 0

啊,终于结束了,,,原来要那么办。。。呵呵。Top

相关问题

关键词

得分解答快速导航

  • 帖主:zcsor
  • lsftest

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo