求助 OpenProcessToken 的问题!

JPEXE 2006-03-15 07:12:40
VB 在用 OpenProcessToken 的时候能够顺利访问属于 SYSTEM 和 Administrator (我的登陆名) 用户的进程,而无法访问其它进程。在这之前我已提升了程序自身进程的权限。请问有什么办法能解决吗?望告之!谢谢……
...全文
197 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
说清楚点啊
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在计算机科学领域,编译原理是研究如何将编程语言转化为机器可执行代码的理论基础。其中,三地址代码(Three-Address Code,TAC)作为一种中间表示形式,在编译器设计中经常被使用,尤其是在生成目标代码的阶段。本文将深入探讨三地址代码的概念、生成器的工作原理及其在编译过程中的作用。 三地址代码是一种简单的低级抽象语法树(AST)表示,每条指令涉及三个操作数,通常包括两个源操作数和一个目的操作数。这种格式简化了代码优化和目标代码生成的复杂性。例如,一个简单的算术表达式“x = y + z”在三地址代码中可能表示为: 在这个例子中,“t1”是一个临时变量,存储了“y + z”的结果,然后这个结果被赋值给“x”。 生成三地址代码的过程通常发生在编译器的中间阶段,即语法分析之后,语义分析之前。这个阶段称为“代码生成”或“中间代码生成”。编译器通过词法分析器处理源代码,将其转化为标记流;接着,语法分析器根据上下文无关文法将标记流解析成抽象语法树。三地址代码生成器就是在这个阶段介入,它遍历AST,为每个节点生成对应的三地址指令。 在Turbo C3.0这样的编译器环境下,开发者可以实现自己的三地址代码生成器。虽然Turbo C3.0是一款较老的编译器,但其C语言编译器设计原理依然适用于现代编译器开发。开发过程中,我们需要考虑如下关键点: 符号表管理:符号表记录了程序中所有标识符的类型、作用域和关联地址,对于生成三地址代码至关重要,因为它提供了关于操作数的类型信息。 数据类型转换:编译器必须处理不同数据类型的运算,确保它们在三地址代码中正确表示。例如,整型与浮点型之间的转换需要特别处理。

1,488

社区成员

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

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