积极答复者
如何编写删除禁用账户超过三个月的脚本

问题
答案
-
您好,
基于您的情况,我修改了一下脚本,请再尝试一下看看是否符合您的需求:
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- 已编辑 Albert LingMicrosoft contingent staff 2018年1月19日 6:40
- 已标记为答案 成都的小菜鸟 2018年1月19日 7:35
-
您好,
根据我的研究和之前的讨论,我将给出如下的建议,希望对您有所帮助:
>> 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账户的禁用信息,所以不会删除本地用户。
如果需要进一步的帮助,请随时告诉我们。
此致
AlbertPlease 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:02
-
您好,
请问这个脚本是否已经符合了您的需要?
如果还有什么我们可以为您做的,请随时在论坛发帖。
此致
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- 已编辑 Albert LingMicrosoft contingent staff 2018年1月19日 8:38
- 已标记为答案 成都的小菜鸟 2018年1月22日 0:27
全部回复
-
您好,
根据我的研究和之前的讨论,我将给出如下的建议,希望对您有所帮助:
>> 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账户的禁用信息,所以不会删除本地用户。
如果需要进一步的帮助,请随时告诉我们。
此致
AlbertPlease 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:02
-
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能否直接直接写一条批处理,让我可以直接运行的。
-
您好,
根据当前的情况,我将提供如下方法来排查这个问题使得脚本能够正常运行:
1. 请打开事件查看器,手动筛选安全日志,查看是否存在事件日志4725:
2. 如果不存在,请尝试运行命令auditpol /get /category:'Account Management',检查User Account Management审核是否已开启:
3. 如果已开启,建议新建一个测试账号,然后禁用它,重复步骤1,看看是否存在事件日志4725。
4. 如果经过上面的步骤,事件日志4725已出现,请右键以管理员身份打开PowerShell,运行Get-WinEvent -FilterHashtable @{LogName = 'Security'; Id = 4725},看看是否有输出结果。
期待您的反馈。
此致
AlbertPlease remember to mark the replies as an answers if they help.
If you have feedback for TechNet Subscriber Support, contact tnmff@microsoft.com -
您好,
基于您的情况,我修改了一下脚本,请再尝试一下看看是否符合您的需求:
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- 已编辑 Albert LingMicrosoft contingent staff 2018年1月19日 6:40
- 已标记为答案 成都的小菜鸟 2018年1月19日 7:35
-
您好,
请问这个脚本是否已经符合了您的需要?
如果还有什么我们可以为您做的,请随时在论坛发帖。
此致
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- 已编辑 Albert LingMicrosoft contingent staff 2018年1月19日 8:38
- 已标记为答案 成都的小菜鸟 2018年1月22日 0:27
-
脚本内容:
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