使用 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) &lt;= 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创建本地管理员帐户

使用 powershell 在服务器上保存文件

如何使用 CSV 创建本地用户并将它们放在一个组中

添加第一个域用户的 PowerShell 脚本 [权限问题]

使用Powershell创建新森林,添加第一台域控制器

使用PowerShell在Azure China创建Data Warehouse