powershell - Powershell 读取一堆日志文件以将计算机添加到 ActiveDirectory 中的组并导出 CSV
问题描述
在 Windows Server 上,每天都会启动一项任务,以更正 DNS 对特定记录的权限并将它们记录到 CSV 文件(日期、计算机名称)中。
这个脚本运行一年了,现在有很多日志文件......
我需要能够:
- 读取所有日志文件
- 将每台计算机添加到 AD 组
- 计算计算机从头开始记录的次数
- 将此导出到另一个 csv 文件
- 导出一种摘要
- 在原始脚本的末尾启动此脚本
我无法修改每天早上 7 点每 10 分钟启动 12 小时的原始脚本。目前,我必须使用位于同一目录中的日志文件(.CSV)
脚本将内容附加到 CSV 文件,如下所示:
$tagfile=get-date -format "ddMMyyyy"
$logfile="C:\Logs\Taches Planifiées\Correctif permissions enregistrements DNS\CorrectionsDNS_$tagfile.csv"
#some code
"$timestamp,$pcname"|Add-content -Path $logfile
每个 CSV 文件都是这样的:
20-06-2019-08:00:03,PO038281
20-06-2019-08:10:03,PO042080
20-06-2019-08:20:05,PC040752
20-06-2019-08:20:05,PO041927
20-06-2019-08:20:05,PO047187
20-06-2019-08:30:05,PO046931
...
我在每个 CSV 文件上编写一个脚本至
$Global:path = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)
$objLogs = New-Object System.Collections.ArrayList
ForEach($file in (Get-ChildItem -Path $path | Where{$_.Name -like "CorrectionsDNS_*.csv"})){
ForEach($line in Get-Content $file){
$obj = New-Object PSObject
$obj | add-member -MemberType NoteProperty -name "Date" -value $line.SubString(0,10)
$obj | add-member -MemberType NoteProperty -name "Hour" -value ($line.Split("-")[3]).Split(",")[0]
$obj | add-member -MemberType NoteProperty -name "Computer" -value ($line.Split("-")[3]).Split(",")[1]
$objLogs += $obj
}
}
$csv = $path + "\" + (Get-Date).ToString("yyyy-MM-dd.HH") + "h" + (Get-Date).ToString("mm") + ".LogsDNS.csv"
$objLogs | Export-CSV -Path $csv -Delimiter ";" -Encoding UTF8 -NoTypeInformation
if ((Get-ADGroup -Identity "ErreurDNS") -eq $false){
New-ADGroup -GroupCategory: "Security" -GroupScope: "Global" -Name "ErreurDNS" -Path: "OU=Ordinateurs,OU=Hotel du Departement,DC=cg53,DC=fr" -SamAccountName:"ErreurDNS"
}
ForEach ($member in ($objLogs.Computer | Group).Name){
Add-ADGroupMember -Identity "ErreurDNS" -Members (Get-ADComputer $member) -ErrorAction Ignore
}
目标 1,2 和 4 似乎还可以。这是 .CSV 文件:
"Date";"Hour";"Computer"
"01-01-2019";"07:30:11";"PO042117"
"01-02-2019";"08:10:03";"PO042150"
"01-02-2019";"08:20:07";"PO042070"
"01-02-2019";"08:30:03";"PO041284"
...
但是如果可能的话,你能帮我实现目标 3,5 和 6 吗?
我已经尝试过按计算机对结果进行分组:
$objLogs.Computer | Group | Select Name,Count
但它是不可读的。有些计算机计算了几条记录,但这里不再存在(替换),或者几周以来它们不再出现问题(重新安装,替换)......
我怎样才能写一个摘要,我可以很容易地看到 DNS 记录已被更正的计算机,以及何时无需每次都将我的 CSV 导入 Excel 表...
上周.csv
"";"Hour";"Computer"
"01-01-2019";"07:30:11";"PO042117"
"01-02-2019";"08:10:03";"PO042150"
"01-02-2019";"08:20:07";"PO042070"
"01-02-2019";"08:30:03";"PO041284"
...
LastMonth.csv、LastYear.csv ...
欢迎任何建议^^
提前致谢。
解决方案
根据我的评论,
- 转换为 [日期时间]
- 按计算机分组对象
- 在日志中评估计算机的第一次、最后一次遭遇
- 输出统计信息(或另存为 csv 文件
Export-Csv
)
## Q:\Test\2019\06\20\SO_56684868.ps1
$Global:path = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)
$objLogs = ForEach($file in (Get-ChildItem -Path $path\CorrectionsDNS_*.csv)){
Import-Csv $file -Header DateTime,Computer | ForEach-Object{
[PSCustomObject]@{
DateTime = [datetime]::ParseExact($_.DateTime,"dd-MM-yyyy-HH:mm:ss",[cultureinfo]::InvariantCulture)
Computer = $_.Computer
}
}
}
$stats = $objLogs | Group-Object Computer | ForEach-Object {
[PSCustomObject]@{
Computer = $_.Name
Count = $_.Count
FirstEnc = ($_.Group.DateTime|Sort-Object)[0]
LastEnc = ($_.Group.DateTime|Sort-Object -Descending)[0]
}
}
$stats
基于上述数据的一些补充的示例输出。(根据我的语言环境设置的日期时间格式)
> . Q:\Test\2019\06\20\SO_56684868.ps1
Computer Count FirstEnc LastEnc
-------- ----- -------- -------
PO038281 2 2019-05-20 08:00:03 2019-06-20 08:00:03
PO042080 2 2019-04-20 08:10:03 2019-06-20 08:10:03
PC040752 2 2019-03-20 08:20:05 2019-06-20 08:20:05
PO041927 2 2019-02-20 08:20:05 2019-06-20 08:20:05
PO047187 2 2019-01-20 08:20:05 2019-06-20 08:20:05
PO046931 2 2019-01-10 08:30:05 2019-06-20 08:30:05