首页 > 解决方案 > Powershell 读取一堆日志文件以将计算机添加到 ActiveDirectory 中的组并导出 CSV

问题描述

在 Windows Server 上,每天都会启动一项任务,以更正 DNS 对特定记录的权限并将它们记录到 CSV 文件(日期、计算机名称)中。

这个脚本运行一年了,现在有很多日志文件......

我需要能够:

  1. 读取所有日志文件
  2. 将每台计算机添加到 AD 组
  3. 计算计算机从头开始记录的次数
  4. 将此导出到另一个 csv 文件
  5. 导出一种摘要
  6. 在原始脚本的末尾启动此脚本

我无法修改每天早上 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 ...

欢迎任何建议^^

提前致谢。

标签: powershellactive-directory

解决方案


根据我的评论,

  • 转换为 [日期时间]
  • 按计算机分组对象
  • 在日志中评估计算机的第一次、最后一次遭遇
  • 输出统计信息(或另存为 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

推荐阅读