求助 OpenProcessToken 的问题!

JPEXE 2006-03-15 07:12:40
VB 在用 OpenProcessToken 的时候能够顺利访问属于 SYSTEM 和 Administrator (我的登陆名) 用户的进程,而无法访问其它进程。在这之前我已提升了程序自身进程的权限。请问有什么办法能解决吗?望告之!谢谢……
...全文
185 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
JPEXE 2006-03-18
  • 打赏
  • 举报
回复
“如果你将你的程序以SYSTEM身份运行也许就可以了.....”

能做到吗?怎样做?
supergreenbean 2006-03-18
  • 打赏
  • 举报
回复
如果你将你的程序以SYSTEM身份运行也许就可以了.....
rainstormmaster 2006-03-17
  • 打赏
  • 举报
回复
//而对于其它进程就不行了(比如通过远程桌面登陆到我系统的用户所执行的进程,还有就是属于 LOCAL SERVICE 和 NETWORK SERVICE 用户的进程)。这个能有什么办法解决吗?

找了个xp测试了一下,不成功的原因是:
hProcessID = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, pid)
没有执行成功
JPEXE 2006-03-17
  • 打赏
  • 举报
回复
回复 rainstormmaster(暴风雨 v2.0):
其实不成功的地方是 OpenProcessToken 而不是 OpenProcess,我在提问时说明过“在这之前我已提升了程序自身进程的权限”,所以 OpenProcess 这里是都能成功没有问题的,申明也没有问题,就是 OpenProcessToken 对某些进程不成功。

不过非常感谢你提供的 WMI 的方法,有效,成功!谢谢!

但对于我原来的那个问题,你若有心,也请进一步帮我想想办法,总之非常感谢你了。
rainstormmaster 2006-03-17
  • 打赏
  • 举报
回复
你把代码帖全,我看看是不是声明的问题
rainstormmaster 2006-03-17
  • 打赏
  • 举报
回复
用WMI吧:
一个按钮,一个listbox:
Private Sub Command1_Click()
Dim strComputer As String
Dim objWMIService, colProcessList, objProcess
Dim strUserDomain
Dim strNameOfUser
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process")
For Each objProcess In colProcessList
Call objProcess.GetOwner(strNameOfUser, strUserDomain)
List1.AddItem "Pid=" & CStr(objProcess.Handle) & " ProcessName=" & objProcess.Name & " Domain\User=" & strUserDomain & "\" & strNameOfUser
Next
End Sub
JPEXE 2006-03-16
  • 打赏
  • 举报
回复
我顶啊!求求大家帮帮忙吧!
JPEXE 2006-03-16
  • 打赏
  • 举报
回复
但我还不想结帖啊!希望有人能帮我解决我的问题。
我把我的相关部分代码帖出来,目的就是想要获取进程的用户名,但有对于有的进程就是无法成功地得到进程名。

Private Function GetPrcUserName(ByVal pid As Long) As String

Dim hProcessID As Long
Dim hToken As Long
Dim res As Long
Dim cbBuff As Long
Dim tiLen As Long
Dim TU As TOKEN_USER
Dim cnt As Long
Dim sAcctName2 As String
Dim cbAcctName As Long
Dim sDomainName As String
Dim cbDomainName As Long
Dim peUse As Long
Dim barr() As Byte

If pid = 0 Or pid = 4 Then
GetPrcUserName = "SYSTEM"
Exit Function
End If

hProcessID = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, pid)
If hProcessID <> 0 Then
If OpenProcessToken(hProcessID, TOKEN_QUERY, hToken) = 1 Then
res = GetTokenInformation(hToken, TokenUser, ByVal 0, tiLen, cbBuff)
If res = 0 And cbBuff > 0 Then
tiLen = cbBuff
If cbBuff > Len(TU) Then Exit Function
res = GetTokenInformation(hToken, TokenUser, TU, tiLen, cbBuff)
If res = 1 And tiLen > 0 Then
sAcctName2 = Space$(255)
sDomainName = Space$(255)
cbAcctName = 255
cbDomainName = 255
res = LookupAccountSid(vbNullString, TU.User.SID, sAcctName2, cbAcctName, sDomainName, cbDomainName, peUse)
GetPrcUserName = Replace(Trim(sAcctName2), Chr(0), "")
End If
End If
Else
GetPrcUserName = "无法获取该进程的用户名"
End If
If hToken Then CloseHandle hToken
CloseHandle hProcessID
End If

End Function
JPEXE 2006-03-16
  • 打赏
  • 举报
回复
rainstormmaster(暴风雨 v2.0),我照您提供的办法,用那个 LOADER 来加载我的程序,但还是不行。
不过还是谢谢您,你的那段代码还是很有用的,我收藏了。
JPEXE 2006-03-16
  • 打赏
  • 举报
回复
谢谢 rainstormmaster(暴风雨 v2.0) 我先试一下。
supergreenbean 2006-03-16
  • 打赏
  • 举报
回复
贴你代码出来看看哈
rainstormmaster 2006-03-16
  • 打赏
  • 举报
回复
参考:
http://community.csdn.net/Expert/topic/4431/4431760.xml?temp=.3278162
JPEXE 2006-03-15
  • 打赏
  • 举报
回复
哦,没说清楚啊!
就是我要用 OpenProcessToken(hPID, TOKEN_QUERY, hToken) 获得进程访问令牌的句柄,但目前只能对属于 SYSTEM 和 Administrator (我的登陆名) 用户的进程有效,而对于其它进程就不行了(比如通过远程桌面登陆到我系统的用户所执行的进程,还有就是属于 LOCAL SERVICE 和 NETWORK SERVICE 用户的进程)。这个能有什么办法解决吗?
chenhui530 2006-03-15
  • 打赏
  • 举报
回复
说清楚点啊

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧