Powershell для чтения группы файлов журнала, чтобы добавить компьютеры в группу в ActiveDirectory и экспортировать CSV - PullRequest
0 голосов
/ 20 июня 2019

На Windows Server задача запускается каждый день, чтобы исправить разрешения для DNS для определенных записей и записать их в файл CSV (Date, ComputerName).

Этот сценарий выполняется с года, исейчас есть много файлов журналов ...

Мне нужно иметь возможность:

  1. Читать все файлы журналов
  2. Добавить каждый компьютер в ADgroup
  3. Подсчитать, сколько раз компьютер регистрируется с самого начала
  4. Экспортировать это в другой CSV-файл
  5. Экспортировать вид абстрактного
  6. Запустить этот скриптв конце исходного сценария

Я не могу изменить исходный сценарий, который запускается каждый день в 7:00 каждые 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 ...

LastWeek.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 ...

Любой совет приветствуется ^^

Заранее спасибо.

1 Ответ

1 голос
/ 20 июня 2019

Согласно моему комментарию,

  • преобразовать в [дата / время]
  • Группировать объект по компьютеру
  • оценить сначала, последнее столкновение компьютера вlogs
  • выводит статистику (или сохраняет как другой файл 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...