使用 PowerShell 检查新创建的本地管理员
Posted
技术标签:
【中文标题】使用 PowerShell 检查新创建的本地管理员【英文标题】:Using PowerShell to Check for Newly Created Local Admins 【发布时间】:2021-07-02 11:56:08 【问题描述】:所以,正如标题所说:我正在尝试编写一个 PowerShell 脚本,以检查是否有任何用户帐户已添加到本地管理员组或已添加为本地计算机上的管理员。我一直在使用 Get-EventLog 和 Get-WinEvent 来尝试完成我想做的事情。我遇到的问题是从事件日志中隔离或提取我想要的信息。
这是我目前所拥有的:
$Date = ((Get-Date).AddDays(-1)).Date
$Events = Get-WinEvent -FilterHashtable @
StartTime = $Date
LogName = 'Security'
ProviderName = 'Microsoft-Windows-Security-Auditing'
ID = 4732
我想,如果我能获得所添加帐户的用户名;它被授予了哪个组或权限;以及它的创建日期,我可以有选择地输出过去 24 小时内每个日志的信息。我不确定我是否应该尝试使用 Get-Item 或 Get-Content,或者是否应该尝试其他方法来解决这个问题。
【问题讨论】:
看起来您所需要的只是本地管理员组的成员身份。您是否尝试过仅使用默认的 cmdlet? 【参考方案1】:除非您安装了 powershell v6.0+,否则您需要改用 -FilterXPath
:
$Alerts = Get-WinEvent -LogName Security -FilterXPath @'
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*[System[
EventID=4732 and
TimeCreated[timediff(@SystemTime) <= 604800000]]] and
*[EventData[Data[@Name="TargetDomainName"]='BUILTIN']] and
*[EventData[Data[@Name='TargetUserName']='Administrators']]
</Select>
</Query>
</QueryList>
'@
如果您运行的是 powershell v6.0 或更高版本,则可以使用 -FilterHashTable
。我会使用这样的东西来检查这些事件。我的服务器并非都具有 v6,因此我必须像这样远程运行它:
#Requires -Version 6.0
$alerts = Get-WinEvent -ComputerName $computername -FilterHashtable @
StartTime = ((Get-Date).AddDays(-1)).Date
LogName = 'Security'
ProviderName = 'Microsoft-Windows-Security-Auditing'
ID = 4732
TargetDomainName='Builtin' ## These fields require
TargetUserName='Administrators' ## Powershell v6.0+
我将介绍如何将事件日志的本地 SID 转换为用于报告的用户名,因为这很麻烦
# Process event(s)
if ($alerts) foreach ($event in $alerts)
# Try and convert SID to account name:
$sid = $event.Properties[1].Value.Value
$localuser = ([System.Security.Principal.SecurityIdentifier]::new($sid)
).Translate([System.Security.Principal.NTAccount])).Value
# Use SID in case of failure
if (!$localuser)$localuser=$event.Properties[1].Value
# Example action
Write-Warning "User $localuser added to local Administrators group on $computername by user $($event.Properties[7].Value)\$($event.Properties[6].Value)"
# Outputs
WARNING: User Server01\local-user01 added to local Administrators group on Server01 by user DOMAIN\AdminUser01
【讨论】:
感谢您的意见,除了这一部分之外,这非常完美:$localuser = Invoke-Command -computername $event.MachineName -ScriptBlock (([System.Security.Principal.SecurityIdentifier]::new($Using:sid) ).Translate([System.Security.Principal.NTAccount])).Value
我将通过我们在我公司创建的一些软件在本地机器上执行此操作。我不熟悉 Invoke-Command 和 ($Using:sid)。有没有办法在本地实现相同的结果?
@davethoughts 我已经编辑了我的工作答案 - 你几乎可以删除这些部分。
我强烈建议您使用真正的 Windows 事件收集工具,如果您打算每天运行它。例如WEF - 它内置在 Windows 中,您可以为其提供完全相同的 XPath 数据。以上是关于使用 PowerShell 检查新创建的本地管理员的主要内容,如果未能解决你的问题,请参考以下文章
powershell 使用PowerShell创建本地管理员帐户