boyhong 发表于 2009-9-18 08:02:17

关于同名进程调试中的一个奇怪问题

本帖最后由 boyhong 于 2009-9-18 08:42 编辑

感谢pusofalse afan 已对我进行的帮助,http://www.autoitx.com/forum.php?mod=viewthread&tid=9785
新发现了如下问题,感激不尽,实在想不明白。竟然运行出错~~能告诉我错在哪儿了吗?

#include <LocalSecurityAuthority.au3>
;ProcessWait("msiexec.exe")
Dim $aPriv = [[$SE_DEBUG_NAME, 2]]
$hToken = _OpenProcessToken(-1)
_AdjustTokenPrivileges($hToken, $aPriv)
_LsaCloseHandle($hToken)
$aProcess = ProcessList("svchost.exe")
;$aProcess = ProcessList("msiexec.exe")
For $i = 1 to $aProcess
      $hProcess = _OpenProcess($aProcess[$i], $READ_CONTROL)
      $sOwner = _QueryKernelObjectSecurityOwner($hProcess)
      If $sOwner = "Builtin\Administrators" Then $sOwner = "NT AUTHORITY\SYSTEM"
      _LsaCloseHandle($hProcess)
                $sOwnertest = StringSplit($sOwner,"\",1)
                MsgBox(64,"",$sOwnertest)
                MsgBox(64,"","当前用户是:"&@UserName)
                ;If ($sOwnertest= @UserName) Then ProcessClose ($aProcess[$i])
                ;EndIf
Next

pusofalse 发表于 2009-9-18 08:34:20

$sOwnertest超出数组范围引发的错误,根本原因是因为_QueryKernelObjectSecurityOwner没有返回一个有效的用户名字符串。svchost.exe进程很奇怪,即使提升权限了,但还是拒绝访问,因为属于NT AUTHORITY\NETWORK SERVICE或LOCAL SERVICE的缘故吧。解决方法?
把标题改好之后告诉你,或者你自己再调试下。

boyhong 发表于 2009-9-18 08:50:25

刚发现若不拆分字符串。。直接:
Msgbox(0, $aProcess[$i], $sOwner)竟然可以运行之。。。至少不报错//

我拿msiexec.exe试也同这个svchost.exe的报错或者无反映。。。
其实我最终想实现的目的是想:结束当前用户发起的msiexec.exe进程。。。

boyhong 发表于 2009-9-18 08:53:29

兄有什么好办法,指点一下吧。。昨晚我是调试了N次实在不行了。。哎。。还得高手出马。。。

pusofalse 发表于 2009-9-18 09:24:45

#include <LocalSecurityAuthority.au3>
_AdjustToSystem()

Func _AdjustToSystem()
        Local $sApp, $sArg, $aPriv = [[$SE_RESTORE_NAME, 2]], $hToken
        If $CmdLine = 0 or $CmdLine <> "-System" Then
                If @Compiled Then
                        $sApp = @ScriptFullPath
                        $sArg = " -System"
                Else
                        $sApp = @AutoItExe
                        $sArg = " " & FileGetShortName(@ScriptFullPath) & " -System"
                EndIf
                $iPid = _CreateProcessAsSystem($sApp, $sArg, "Winlogon.exe")
                Exit
        Else
                $hToken = _OpenProcessToken(-1)
                _AdjustTokenPrivileges($hToken, $aPriv)
                _LsaCloseHandle($hToken)
        EndIf
EndFunc        ;==>_AdjustToSystem

$sUserLogged = _LsaGetUserName(0)
$aProcess = ProcessList("msiexec.exe")

For $i = 1 to $aProcess
      $hProcess = _OpenProcess($aProcess[$i], $READ_CONTROL)
      $sOwner = _QueryKernelObjectSecurityOwner($hProcess)
      If $sOwner = "Builtin\Administrators" Then $sOwner = "NT AUTHORITY\SYSTEM"
      _LsaCloseHandle($hProcess)
        $hProcess = 0
      If $sOwner = $sUserLogged Then
             If Msgbox(1, $aProcess[$i] & " - " & $aProcess[$i], "Whether terminate?") = 1 Then ProcessClose($aProcess[$i])
         EndIf
Next

boyhong 发表于 2009-9-18 11:27:15

能否兄好人做到底。。。我刚才在调试发现,不光有SYSTEM发起的进程:msiexec.exe,当前用户竟然发起了两个同名进程“msiexec.exe”,咱们怎么判断一下,杀掉相对PID数字大的那个进程。。。。
感谢感谢加感谢~~

dzztxiao 发表于 2010-4-4 02:31:29

pusofalse   蛮热心的
页: [1]
查看完整版本: 关于同名进程调试中的一个奇怪问题