windows服务powershell的.exe权限
我的代码被屏蔽了
我将尝试解释我想用它做什么,我的代码是扫描不同的 Windows 服务,只将使用 .exe 的内容保留在内存中,然后在其中搜索用户可以完全控制的内容。我希望它在最后显示服务及其权利。
$services = Get-WmiObject win32_service | ?{$_.PathName -like '*.exe*'} | select Name, State, Pathname, StartName | Out-Null
foreach ($service in $services) {
$var = "{0}.exe" -f ($Service.PathName -Split ".exe")[0]
foreach ($right in $var ){
if ( (Get-Acl $var).Access -ccontains "BUILTINUtilisateurs FullControl "{
Write-Warning " Exploit detected "
}
}
}
提前感谢您的反馈
回答
Get-CimInstance Win32_Service |
Where-Object { $_.PathName -like '*.exe*'} |
Select-Object Name, State, Pathname, StartName |
ForEach-Object {
$_.PathName = ($_.PathName -split '(?<=.exeb)')[0].Trim('"')
Add-Member -PassThru -InputObject $_ Acl (Get-Acl -LiteralPath $_.PathName)
} |
Where-Object {
$_.Acl.Access.Where({
$_.IdentityReference -ceq 'BUILTINUtilisateurs' -and
$_.FileSystemRights -eq 'FullControl'
}, 'First').Count -gt 0
}
请注意,我已替换Get-WmiObject为Get-CimInstance,因为 CIM cmdlet 取代了 PowerShell v3(2012 年 9 月发布)中的 WMI cmdlet。因此,应该避免使用 WMI cmdlet,尤其是因为 PowerShell (Core) (v6+),未来所有的努力都将进行,甚至不再拥有它们。但是请注意,WMI 仍然是CIM cmdlet 的基础。有关更多信息,请参阅此答案。
以上使用ForEach-Object调用:
-
更新
.PathName每个对象的属性以仅包含每个服务的可执行文件的 - 未引用 - 路径。 -
.Acl通过 向每个对象添加一个属性Add-Member,其中包含通过获得的服务可执行文件的 ACLGet-Acl。
生成的对象列表随后由其服务可执行 ACL 包含身份BUILTINUtilisateurs[1]条目的对象进行过滤,该条目具有对可执行文件的完全控制权。
也就是说,结果对象实际上是您打算为其发出的对象 Write-Warning " Exploit detected "
至于你尝试了什么:
-
$services = ... | Out-Null根据定义,变量中不捕获任何内容[2]$services,因为它Out-Null的目的是抑制输出。 -
虽然
$var = "{0}.exe" -f ($Service.PathName -Split ".exe")[0]确实提取了可执行路径(虽然.exe应该是.exeb,为了健壮性),但它可能包含括起来的双引号,应该去掉。 -
目前还不清楚
$rights从哪里来。 -
您无法使用
-ccontains跨匹配多个对象的属性,并注意为目的-contains经营者及其变种是一个值的测试存在于全,集合中,而不是寻找一个子串在一个字符串。
[1] 有趣的是,这些身份引用是本地化的;在美国-英语系统上的等价物是BUILTINUsers. 通常,最好获得此身份的独立于文化的表示形式,即其 SID,并将其用于比较:$_.IdentityReference.Translate([System.Security.Principal.SecurityIdentifier]).Value -eq 'S-1-5-32-545'
[2] 粗略地说,$null; 从技术上讲,它是 PowerShell 用来表示“未收到输出”的单例值,[System.Management.Automation.Internal.AutomationNull]::Value.