本帖最后由 txm888 于 2011-11-7 23:49 编辑
最近测试了下P版的修改服务权限,在64位系统下修改后,再修改不回来了,麻烦懂的请看一下,谢谢#include <Array.au3>
#include <LocalSecurityAuthority.au3>
$sService = "Au3MemCleaner" ; 服务名称。
$aAceList = _QueryServiceObjectSecurityDacl($sService) ; 直接返回包含权限信息的数组(不返回访问控制列表(ACL)指针)。
$aSecur = _GetNamedSecurityInfo($sService, $SE_SERVICE, 4)
$pACL = $aSecur[6]
$pSecurDesc = $aSecur[8]
; $pACL = _GetSecurityDescriptorDacl($pSecurDesc)
$aAceList = _GetExplicitEntriesFromAcl($pACL)
_Arraydisplay($aAceList, $sService & "服务访问权限")
$sUserName = "Everyone"
$iAccessMask = bitOR($READ_CONTROL, $WRITE_DAC)
$iAccessMode = $GRANT_ACCESS
$iInheritance = $NO_INHERITANCE
$pOrigAcl = 0
Dim $aAccess[1][4] = [[$sUserName, $iAccessMask, $iAccessMode, $iInheritance]]
$pNewAcl = _SetEntriesInAcl($aAccess, $pOrigAcl)
; $pNewAcl中,只允许当前用户读取和设置$sService 服务的安全信息。
; 要允许$sUserName用户有其他的权限,请自行修改$iAccessMask的值,以下网址中包含各权限所对应的值。
; 注意$iAccessMask一定要包含READ_CONTROL 和WRITE_DAC。
; http://msdn.microsoft.com/en-us/library/ms685981(VS.85).aspx
$aNewAceList = _GetExplicitEntriesFromAcl($pNewAcl)
_Arraydisplay($aNewAceList, $sService & "服务访问权限")
$iResult = _SetNamedSecurityInfo($sService, $SE_SERVICE, $DACL_SECURITY_INFORMATION, 0, 0, $pNewAcl, 0)
If $iResult = True Then
ShellExecute("Services.msc")
Msgbox(0, '', "成功,请测试" & $sService & "服务是否能够访问,不能访问则设置权限成功。")
Else
Msgbox(0, "", "失败,错误码:" & @ERROR)
EndIf
; 设置回其原来的权限。
$iResult = _SetNamedSecurityInfo($sService, $SE_SERVICE, $DACL_SECURITY_INFORMATION, 0, 0, $pAcl, 0)
If $iResult = True Then
Msgbox(0, '', "成功,请测试" & $sService & "服务是否能够访问,能访问则设置权限成功。")
Else
Msgbox(0, "", "失败,错误码:" & @ERROR)
EndIf
而且权限值里已经包含READ_CONTROL(读取安全信息) 和WRITE_DAC(设置安全息),指定的$sUserName用户应该有重新设置回其原来的安全信息的权限啊~~~
测试环境为win R2 2008 64位
注意,注册的服务是通过这程序自身注册的!
|