none
如何编写删除禁用账户超过三个月的脚本 RRS feed

  • 问题

  • 关于审核账户相关问题已经接到反馈。https://social.technet.microsoft.com/Forums/zh-CN/6dec24ab-5b3c-4048-b9a5-19db9965c29f?forum=winserver8zhcn

    现有如下问题:

    1.如何确定禁用用户的禁用事件

    2.如何准确的删除禁用时间之内(三个月及以上)的用户

    3.删除用户的命令多少?怎么确定删除的是活动目录中的用户。而非DC本地用户


    2018年1月17日 9:37

答案

  • 您好,

    基于您的情况,我修改了一下脚本,请再尝试一下看看是否符合您的需求:
    Get-WinEvent -FilterHashtable @{LogName = 'Security'; Id = 4725} | ForEach-Object {
        $xml = [xml] $_.ToXml()
        $_ | Select-Object @{Name = 'Name'; Expression = {$xml.Event.EventData.Data[0].'#text'}}, TimeCreated
    } | Group-Object Name | Select-Object Name, @{Name = 'TimeCreated'; Expression = {$_.Group.TimeCreated | Sort-Object | Select-Object -Last 1}} | 
    Where-Object {$_.TimeCreated -le (Get-Date).AddDays(-90)} | ForEach-Object {
        try {
            if (!(Get-ADUser -Identity $_.Name).Enabled) {
                Remove-ADUser -Identity $_.Name -Confirm:$false -WhatIf
            }
        }
        catch {
        }
    }

    如果需要进一步的帮助,请随时告诉我们。

    此致
    Albert

    Please remember to mark the replies as an answers if they help.
    If you have feedback for TechNet Subscriber Support, contact tnmff@microsoft.com

    2018年1月19日 6:39
  • 您好,

    根据我的研究和之前的讨论,我将给出如下的建议,希望对您有所帮助:

    >> 1.如何确定禁用用户的禁用事件
    在开启了User Account Management的成功审核的前提下,您可以尝试在PDC上运行如下PowerShell脚本列出所有被禁用的用户名称、执行禁用的用户名称和禁用时间:
    Get-WinEvent -FilterHashtable @{LogName = 'Security'; Id = 4725} | ForEach-Object {
        $xml = [xml] $_.ToXml()
        $_ | Select-Object @{Name = 'Name'; Expression = {$xml.Event.EventData.Data[0].'#text'}}, 
        @{Name = 'Operator'; Expression = {$xml.Event.EventData.Data[4].'#text'}}, 
        @{Name = 'TimeDisabled'; Expression = {$_.TimeCreated}}
    }

    执行结果类似于下图:


    >> 2.如何准确的删除禁用时间之内(三个月及以上)的用户
    基于上面的基础,我们就可以通过下面的脚本来删除禁用时间为三个月及以上的AD账户:
    Get-WinEvent -FilterHashtable @{LogName = 'Security'; Id = 4725} | 
    Where-Object {$_.TimeCreated -le (Get-Date).AddDays(-90)} | ForEach-Object {
        $xml = [xml] $_.ToXml()
        $xml.Event.EventData.Data[0].'#text'
    } | Select-Object -Unique | Remove-ADUser -Confirm:$false -WhatIf

    执行结果类似于下图:


    请注意:运行上面的命令并不会直接删除这些用户,只是确认一下命令将要对哪些AD账户进行操作,确认完成后,去掉脚本最后的-WhatIf即可执行删除。

    >> 3.删除用户的命令多少?怎么确定删除的是活动目录中的用户。而非DC本地用户
    删除的命令是Remove-ADUser,由于事件ID 4725其本身记录的就是AD账户的禁用信息,所以不会删除本地用户。

    如果需要进一步的帮助,请随时告诉我们。

    此致
    Albert

    Please remember to mark the replies as an answers if they help.
    If you have feedback for TechNet Subscriber Support, contact tnmff@microsoft.com

    2018年1月18日 2:58
  • 您好,

    请问这个脚本是否已经符合了您的需要?
    如果还有什么我们可以为您做的,请随时在论坛发帖。

    此致
    Albert

    Please remember to mark the replies as an answers if they help.
    If you have feedback for TechNet Subscriber Support, contact tnmff@microsoft.com

    2018年1月19日 8:38

全部回复

  • 您好,

    根据我的研究和之前的讨论,我将给出如下的建议,希望对您有所帮助:

    >> 1.如何确定禁用用户的禁用事件
    在开启了User Account Management的成功审核的前提下,您可以尝试在PDC上运行如下PowerShell脚本列出所有被禁用的用户名称、执行禁用的用户名称和禁用时间:
    Get-WinEvent -FilterHashtable @{LogName = 'Security'; Id = 4725} | ForEach-Object {
        $xml = [xml] $_.ToXml()
        $_ | Select-Object @{Name = 'Name'; Expression = {$xml.Event.EventData.Data[0].'#text'}}, 
        @{Name = 'Operator'; Expression = {$xml.Event.EventData.Data[4].'#text'}}, 
        @{Name = 'TimeDisabled'; Expression = {$_.TimeCreated}}
    }

    执行结果类似于下图:


    >> 2.如何准确的删除禁用时间之内(三个月及以上)的用户
    基于上面的基础,我们就可以通过下面的脚本来删除禁用时间为三个月及以上的AD账户:
    Get-WinEvent -FilterHashtable @{LogName = 'Security'; Id = 4725} | 
    Where-Object {$_.TimeCreated -le (Get-Date).AddDays(-90)} | ForEach-Object {
        $xml = [xml] $_.ToXml()
        $xml.Event.EventData.Data[0].'#text'
    } | Select-Object -Unique | Remove-ADUser -Confirm:$false -WhatIf

    执行结果类似于下图:


    请注意:运行上面的命令并不会直接删除这些用户,只是确认一下命令将要对哪些AD账户进行操作,确认完成后,去掉脚本最后的-WhatIf即可执行删除。

    >> 3.删除用户的命令多少?怎么确定删除的是活动目录中的用户。而非DC本地用户
    删除的命令是Remove-ADUser,由于事件ID 4725其本身记录的就是AD账户的禁用信息,所以不会删除本地用户。

    如果需要进一步的帮助,请随时告诉我们。

    此致
    Albert

    Please remember to mark the replies as an answers if they help.
    If you have feedback for TechNet Subscriber Support, contact tnmff@microsoft.com

    2018年1月18日 2:58
  • Get-WinEvent : 无法检索到有关 Security 日志的信息。错误: 尝试执行未经授权的操作。。
    所在位置 行:1 字符: 1
    + Get-WinEvent -FilterHashtable @{LogName = 'Security'; Id = 4725} | ForEach-Objec ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [Get-WinEvent], Exception
        + FullyQualifiedErrorId : LogInfoUnavailable,Microsoft.PowerShell.Commands.GetWinEventCommand

    Get-WinEvent : 在 localhost 计算机上没有与“Security”匹配的事件日志。
    所在位置 行:1 字符: 1
    + Get-WinEvent -FilterHashtable @{LogName = 'Security'; Id = 4725} | ForEach-Objec ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (Security:String) [Get-WinEvent], Exception
        + FullyQualifiedErrorId : NoMatchingLogsFound,Microsoft.PowerShell.Commands.GetWinEventCommand

    Get-WinEvent : 参数错误。
    所在位置 行:1 字符: 1
    + Get-WinEvent -FilterHashtable @{LogName = 'Security'; Id = 4725} | ForEach-Objec ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [Get-WinEvent], EventLogException
        + FullyQualifiedErrorId : System.Diagnostics.Eventing.Reader.EventLogException,Microsoft.PowerShell.Commands.GetWi
       nEventCommand

    能否直接直接写一条批处理,让我可以直接运行的。

    2018年1月19日 2:02
  • 您好,

    根据当前的情况,我将提供如下方法来排查这个问题使得脚本能够正常运行:
    1. 请打开事件查看器,手动筛选安全日志,查看是否存在事件日志4725:

    2. 如果不存在,请尝试运行命令auditpol /get /category:'Account Management',检查User Account Management审核是否已开启:

    3. 如果已开启,建议新建一个测试账号,然后禁用它,重复步骤1,看看是否存在事件日志4725。
    4. 如果经过上面的步骤,事件日志4725已出现,请右键以管理员身份打开PowerShell,运行Get-WinEvent -FilterHashtable @{LogName = 'Security'; Id = 4725},看看是否有输出结果。

    期待您的反馈。

    此致
    Albert

    Please remember to mark the replies as an answers if they help.
    If you have feedback for TechNet Subscriber Support, contact tnmff@microsoft.com

    2018年1月19日 2:30
  • 
    2018年1月19日 3:37
  • 
    以上检测到的账户查看状态应该是启用的。而且每次运行这个脚本都会这么多记录吗?  能不能过滤掉这种报错
    2018年1月19日 3:40
  • 您好,

    基于您的情况,我修改了一下脚本,请再尝试一下看看是否符合您的需求:
    Get-WinEvent -FilterHashtable @{LogName = 'Security'; Id = 4725} | ForEach-Object {
        $xml = [xml] $_.ToXml()
        $_ | Select-Object @{Name = 'Name'; Expression = {$xml.Event.EventData.Data[0].'#text'}}, TimeCreated
    } | Group-Object Name | Select-Object Name, @{Name = 'TimeCreated'; Expression = {$_.Group.TimeCreated | Sort-Object | Select-Object -Last 1}} | 
    Where-Object {$_.TimeCreated -le (Get-Date).AddDays(-90)} | ForEach-Object {
        try {
            if (!(Get-ADUser -Identity $_.Name).Enabled) {
                Remove-ADUser -Identity $_.Name -Confirm:$false -WhatIf
            }
        }
        catch {
        }
    }

    如果需要进一步的帮助,请随时告诉我们。

    此致
    Albert

    Please remember to mark the replies as an answers if they help.
    If you have feedback for TechNet Subscriber Support, contact tnmff@microsoft.com

    2018年1月19日 6:39
  • 您好,

    请问这个脚本是否已经符合了您的需要?
    如果还有什么我们可以为您做的,请随时在论坛发帖。

    此致
    Albert

    Please remember to mark the replies as an answers if they help.
    If you have feedback for TechNet Subscriber Support, contact tnmff@microsoft.com

    2018年1月19日 8:38
  • https://social.technet.microsoft.com/Forums/zh-CN/436be72b-8cdf-4eec-b134-93b96cf48064/dc?forum=winserver8zhcn

    本链接问题已解决。以上链接的问题能否给予解答,十分感谢。

    2018年1月22日 0:28
  • 脚本内容:

    Get-WinEvent -FilterHashtable @{LogName = 'Security'; Id = 4725} | ForEach-Object {
        $xml = [xml] $_.ToXml()
        $_ | Select-Object @{Name = 'Name'; Expression = {$xml.Event.EventData.Data[0].'#text'}}, TimeCreated
    } | Group-Object Name | Select-Object Name, @{Name = 'TimeCreated'; Expression = {$_.Group.TimeCreated | Sort-Object | Select-Object -Last 1}} | 
    Where-Object {$_.TimeCreated -le (Get-Date).AddDays(-1)} | ForEach-Object {
        try {
            if (!(Get-ADUser -Identity $_.Name).Enabled) {
                Remove-ADUser -Identity $_.Name -Confirm:$false -WhatIf
            }
        }
        catch {
        }
    }

    报错:

    Get-WinEvent : 无法检索到有关 Security 日志的信息。错误: 尝试执行未经授权的操作。。
    所在位置 D:\jiaoben\根据安全日志自动删除禁用账户.ps1:1 字符: 1
    + Get-WinEvent -FilterHashtable @{LogName = 'Security'; Id = 4725} | ForEach-Objec ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [Get-WinEvent], Exception
        + FullyQualifiedErrorId : LogInfoUnavailable,Microsoft.PowerShell.Commands.GetWinEventCommand
     
    Get-WinEvent : 在 localhost 计算机上没有与“Security”匹配的事件日志。
    所在位置 D:\jiaoben\根据安全日志自动删除禁用账户.ps1:1 字符: 1
    + Get-WinEvent -FilterHashtable @{LogName = 'Security'; Id = 4725} | ForEach-Objec ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (Security:String) [Get-WinEvent], Exception
        + FullyQualifiedErrorId : NoMatchingLogsFound,Microsoft.PowerShell.Commands.GetWinEventCommand

    2019年8月22日 2:13