关于进程调用者名称的问题,SID?
已知一个进程的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




