
VB 如何 获取 指定用户名下的 所有进程?
在打开任务管理器后,用户名有administrator,system,localservice,networkservice等,请问,怎么才能获取到administrat...
在打开任务管理器后,用户名有administrator, system , local service ,network service 等, 请问,怎么才能获取到administrator的所有进程呢?
百度没人了么?还是我问的不够清楚? 展开
百度没人了么?还是我问的不够清楚? 展开
2个回答
2011-07-02
展开全部
要想获取进程的用户名和账号,应首先调用OpenProcessToken打开进程的令牌(Token),打开方式设为TOKEN_QUERY,然后将TOKEN_INFORMATION_CLASS设为 TokenUser调用GetTokenInformation枚举进程的令牌信息块SID,通常称为安全标识(Security Identifier),最后调用LookupAccountSid从SID中检索用户名和账号。
char buf[256], szUser[128], szComputer[128];
HANDLE hProcess, hToken;
DWORD cbUser, cbComputer;
SID_NAME_USE snu;
if(ProcessID <= 0x0c)
显示用户名为"SYSTEM";
Else
显示用户名为"SERVICE ";
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, ProcessID);
OpenProcessToken(hProcess, TOKEN_QUERY, &hToken);
GetTokenInformation(hToken, TokenUser, &buf, 256, &cbUser);
cbComputer=sizeof(szComputer);
LookupAccountSid(NULL, (DWORD *)(*(DWORD *)buf), szUser,
&cbUser, szComputer, &cbComputer, &snu);
CloseHandle(hToken);
CloseHandle(hProcess);
示例里,已经把所有进程相关信息保存在ll_processes[]数组里
进程名字列表在lb_1里
知道进程名字,调用
ll_hprocess = OpenProcess(PROCESS_ALL_ACCESS, 0, ll_processes[ll_index])
可以得到你进程的句柄
然后:
OpenProcessToken(ll_hprocess , TOKEN_QUERY, &hToken);
GetTokenInformation(hToken, TokenUser, &buf, 256, &cbUser);
cbComputer=sizeof(szComputer);
LookupAccountSid(NULL, (DWORD *)(*(DWORD *)buf), szUser, &cbUser, szComputer, &cbComputer, &snu);
则 用户名和账号分别到存放变量szUser和szComputer中。
OpenProcessToken GetTokenInformation LookupAccountSid 我只找到了函数原型,没有找到如何在PB中声明。
-----------------
BOOL OpenProcessToken( __in HANDLE ProcessHandle, //要修改访问权限的进程句柄 __in DWORD DesiredAccess, //指定你要进行的操作类型 __out PHANDLE TokenHandle //返回的访问令牌指针 );
BOOL WINAPI GetTokenInformation(
__in HANDLE TokenHandle,
__in TOKEN_INFORMATION_CLASS TokenInformationClass,
__out_opt LPVOID TokenInformation,
__in DWORD TokenInformationLength,
__out PDWORD ReturnLength
);
别名:LookupAccountSidA
库名:advapi32.dll
说明:
返回值:
实例:
参数表:
声明:Declare Function LookupAccountSid Lib "advapi32.dll" Alias "LookupAccountSidW" (ByVal lpSystemName As Any, Sid As Any, Name As Any, cbName As Long, ReferencedDomainName As Any, cbReferencedDomainName As Long, peUse As Integer) As Long
char buf[256], szUser[128], szComputer[128];
HANDLE hProcess, hToken;
DWORD cbUser, cbComputer;
SID_NAME_USE snu;
if(ProcessID <= 0x0c)
显示用户名为"SYSTEM";
Else
显示用户名为"SERVICE ";
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, ProcessID);
OpenProcessToken(hProcess, TOKEN_QUERY, &hToken);
GetTokenInformation(hToken, TokenUser, &buf, 256, &cbUser);
cbComputer=sizeof(szComputer);
LookupAccountSid(NULL, (DWORD *)(*(DWORD *)buf), szUser,
&cbUser, szComputer, &cbComputer, &snu);
CloseHandle(hToken);
CloseHandle(hProcess);
示例里,已经把所有进程相关信息保存在ll_processes[]数组里
进程名字列表在lb_1里
知道进程名字,调用
ll_hprocess = OpenProcess(PROCESS_ALL_ACCESS, 0, ll_processes[ll_index])
可以得到你进程的句柄
然后:
OpenProcessToken(ll_hprocess , TOKEN_QUERY, &hToken);
GetTokenInformation(hToken, TokenUser, &buf, 256, &cbUser);
cbComputer=sizeof(szComputer);
LookupAccountSid(NULL, (DWORD *)(*(DWORD *)buf), szUser, &cbUser, szComputer, &cbComputer, &snu);
则 用户名和账号分别到存放变量szUser和szComputer中。
OpenProcessToken GetTokenInformation LookupAccountSid 我只找到了函数原型,没有找到如何在PB中声明。
-----------------
BOOL OpenProcessToken( __in HANDLE ProcessHandle, //要修改访问权限的进程句柄 __in DWORD DesiredAccess, //指定你要进行的操作类型 __out PHANDLE TokenHandle //返回的访问令牌指针 );
BOOL WINAPI GetTokenInformation(
__in HANDLE TokenHandle,
__in TOKEN_INFORMATION_CLASS TokenInformationClass,
__out_opt LPVOID TokenInformation,
__in DWORD TokenInformationLength,
__out PDWORD ReturnLength
);
别名:LookupAccountSidA
库名:advapi32.dll
说明:
返回值:
实例:
参数表:
声明:Declare Function LookupAccountSid Lib "advapi32.dll" Alias "LookupAccountSidW" (ByVal lpSystemName As Any, Sid As Any, Name As Any, cbName As Long, ReferencedDomainName As Any, cbReferencedDomainName As Long, peUse As Integer) As Long
更多追问追答
追问
VB 如何 获取 指定用户名下的 所有进程?
VB 如何 获取 指定用户名下的 所有进程?
展开全部
Private Sub Command1_Click()
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set ps = objWMIService.ExecQuery("select * from Win32_Process")
For Each p In ps
s = s & vbCrLf & p.Name
Next
MsgBox s
End Sub
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set ps = objWMIService.ExecQuery("select * from Win32_Process")
For Each p In ps
s = s & vbCrLf & p.Name
Next
MsgBox s
End Sub
追问
“指定用户名下的 所有进程”,听说这个挺难的。 我是说这句话读起来挺难懂的。
追答
已修改
Private Sub Command2_Click()
b = InputBox("请输入用户名")
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set ps = objWMIService.ExecQuery("select * from Win32_Process")
For Each p In ps
If p.getowner(user, Domain) = 0 Then
If b = user Then
s = s & vbCrLf & p.Name & Space(1) & a
End If
End If
Next
MsgBox s
End Sub
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询