PowerShell - [решено] Скрипт - оповещение об изменении в группе AD

Аватара пользователя
Iska

Re: PowerShell - [решено] Скрипт - оповещение об изменении в группе AD

Сообщение Iska »

Iska, спасибо!

Правда у меня нет такого выбора при редактировании. Использовал написание тега вручную.
Аватара пользователя
Geliosvamp

Re: PowerShell - [решено] Скрипт - оповещение об изменении в группе AD

Сообщение Geliosvamp »

Посмотрите в
Профиль
, Настройки форума, Разное. Попробуйте перевыбрать «Интерфейс редактора сообщений: Базовый редактор…».
Аватара пользователя
Kazun

Re: PowerShell - [решено] Скрипт - оповещение об изменении в группе AD

Сообщение Kazun »

1)Как вариант можно обнулить значения из CSV файла, т.к "" -ne $null.





Код:

Код: Выделить всё

$prop = Write-Output Name Title Department
$usersold | Foreach {
	$obj = $_
	$prop | Foreach { if($obj.$_ -eq ""){$obj.$_ = $null}
}

2) если description изменился, то нужно отослать новые данные ответственному и обновить файл comparison.csv - Изменилось значение у группы,а состав остался, какой смысл высылать описание у группы владельцу?
Аватара пользователя
Geliosvamp

Re: PowerShell - [решено] Скрипт - оповещение об изменении в группе AD

Сообщение Geliosvamp »

Iska, у меня был выбран расширенный редактор. Выбрал базовый, но не помогло.



Kazun,

1) Спасибо! Помогло Изображение Использование в данному случае Write-Output для меня неожиданно, возьму на заметку.

2) Должности меняются довольно редко, поэтому особой проблемы нет. Если изменился человек на данной должности, то в целом можно было бы сделать доп. проверку, но я думаю, что новенькому сотруднику это не нужно, т.к. он ещё не влился в работу.



Добавил в скрипт возможность исключать из проверки некоторые группы.



В целом скрипт работает как надо, за что огромное спасибо тебе, Kazun!



Ещё хотелось бы:

1) body письма как-нибудь выудить из функции и задавать в начале скрипта.

2) в csv-файле, когда открываешь его в excel, все ширина столбцов стандартного размера, а хотелось бы, чтобы ширина подбиралась по содержимому ячеек.



Код: Выделить всё

Import-Module Activedirectory
cls
# задаем константы
$path = "OU=FS,OU=Groups,OU=Ulsk,DC=corp,DC=contoso,DC=loc" # ветка АД, где искать группы FS_*
$outcsvpath = "e:\FS_Script\" # путь, куда сохраняются файлы
$changefailpath = "$outcsvpath" + "comparison.csv" # путь сохранения файла изменений
$mailfrom = "gelios@mail.ru" # почтовый адрес, от имени которого осуществляется рассылка
$smtpserver = "mail.ru" # почтовый сервер
# список папок, которые исключаются из поиска
$exceptions = 
@(
""
)
# функция создаёт файл "FS*" с инфой и обновляет файл comparison.csv
function sendinfo ($fss)
{
    $massiveold = Import-Csv -Path $changefailpath -Encoding UTF8
    foreach ($fs in $fss)
    {
        if ($fs -ne $NULL)
        {
            # получаем description группы fs
            $desc = Get-ADGroup -Identity "$fs" -Properties Description | Foreach {$_.Description}
            # если description содержит "Штат"
            if ($desc -like "Штат*")
            {
                # получаем данные о пользователях папки fs
                Get-ADGroupMember $fs -Recursive  | Get-ADUser -Properties Name,Title,Department | Select Name,Title,Department |
                # записываем данные в соответствующий файл
                export-csv -Path ("$outcsvpath" + "$fs" + ".csv") -Encoding UTF8 -NoTypeInformation -Delimiter ";"
                "Сохранен файл: " + "$outcsvpath" + "$fs" + ".csv"
                # получаем почтовый адрес ответственного
                $mailto = Get-ADGroupMember $desc | Get-ADUser -Properties mail | foreach {$_.mail}
                Send-MailMessage -From "$mailfrom" -To "$mailto" -SmtpServer "$smtpserver" -Encoding UTF8 `
                -Attachments ("$outcsvpath" + "$fs" + ".csv") -Subject "Отчёт о доступе к папке $fs" `
                -Body "Добрый день! В доступе к подконтрольной Вам папке $fs произошли изменения. `n
Подробная информация о том, кто имеет к ней доступ, содержится во вложенном файле. `n
Ваш, департамент ИТ."
                "Отправлено письмо по адресу: $mailto"
                # получаем массив, содержащий имя группы и её description
                if ($massiveold.name -notcontains $fs)
                {
                    $massiveold += Get-ADGroup -Identity "$fs" -Properties description, name | select name, description
                }
            }
        }
    }
    # сохраняем обновлённую информацию в comparison.csv
    $massiveold | export-csv -Path $changefailpath -Encoding UTF8 -NoTypeInformation
    "Файл $changefailpath обновлён"
}
# функция для начального создания файлов csv с информацией о юзера в группах
function Get-FirstFiles
{
    # получаем имена групп в OU $path
    $fss = Get-ADGroup -Filter * -SearchBase "$path" -Properties name| foreach {$_.name}
    $compfile = @()
    foreach ($fs in $fss)
    {
        if ($fs -ne $NULL)
        {
            # получаем description группы fs
            "fs= $fs"
            $desc = Get-ADGroup -Identity "$fs" -Properties Description | Foreach {$_.Description}
            # если description содержит "Штат"
            if ($desc -like "Штат*")
            {
                # получаем данные о пользователях папки fs
                $m = Get-ADGroupMember $fs -Recursive  | Get-ADUser -Properties Name,Title,Department | Select Name,Title,Department |
                # записываем данные в соответствующий файл
                export-csv -Path ("$outcsvpath" + "$fs" + ".csv") -Encoding UTF8 -NoTypeInformation -Delimiter ";"
                "fs= $fs"
                # получаем массив, содержащий имя группы и её description
                $compfile += Get-ADGroup -Identity "$fs" -Properties description, name | select name, description
                "Сохранен файл: $outcsvpath" + "$fs" + ".csv"+"`n"
            }
        }
    }
    # сохраняем информацию для проверки изменений в comparison.csv
    $compfile | export-csv -Path $changefailpath -Encoding UTF8 -NoTypeInformation
    "Файлы для всех папок FS сохранены"
}
#Get-FirstFiles
# получаем массив новых данных о группах FS и отбираем только те, у которых в description вида "Штат*"
# так же отбрасываем исключения, содержащиеся в $exceptions
$massivenew = Get-ADGroup -Filter * -searchbase $path -Properties name, description -SearchScope Subtree |
select name, description | where {($_.description -like "Штат*") -and ($exceptions -notcontains $_.name)}
# получаем массив имён всех файлов с данными, которые записаны в comparison.csv
$massiveold = Import-Csv -Path $changefailpath -Encoding UTF8
# сравниваем новый массив со старым по имени групп
compare-Object -ReferenceObject $massivenew -DifferenceObject $massiveold -IncludeEqual -Property name | foreach {
    "Проверяем $($_.name)"
    # если папка есть в AD и её нет в файле, то создаём файл и отправляем информацию ответственному
    if ($_.SideIndicator -eq "<=")
    {
        "Найдена новая папка в AD: $($_.name)"
        sendinfo -fss "$($_ | foreach {$_.name})"
    }
    # если name не отличается от старого, то нужно проверить description 
    elseif ($_.SideIndicator -eq "==")
    {
        # получаем имя группы, у которой нужно проверить description
        $name = $_.name
        # получаем description группы с таким именем из нового массива
        $massivenew | foreach {
            if ($_.name -eq "$name")
            {
                $descnew = $_.description
            }
        }
        # получаем description группы с таким именем из старого массива
        $massiveold | foreach {
            if ($_.name -eq "$name")
            {
                $descold = $_.description
            }
        }
        # сравниваем description новый и старый
        # если description изменился, то нужно отослать новые данные ответственному и обновить файл comparison.csv
        if ($descnew -ne $descold)
        {
            $massive = @()
            $i = ""
            foreach ($i in $massiveold) {
                if (($i.name) -ne $name)
                {
                    $massive += $i
                }
            }
            $massiveold = $massive
            $massive | export-csv -Path $changefailpath -Encoding UTF8 -NoTypeInformation
            "Изменилось поле description: изменился ответственный"
            sendinfo -fss $name
        }
        # если description не изменился, сравниваем все поля в файлах и, если находим хоть одно несоответствие,
        # то отправляем письмо ответственному с новой информацией
        else 
        {
            $name = $_.name
            $usersold = Import-Csv -Path ("$outcsvpath" + "$name" + ".csv") -Encoding UTF8 -Delimiter ";"
            $prop = Write-Output Name Title Department
            $usersold | Foreach {
	            $obj = $_
	            $prop | Foreach { if($obj.$_ -eq ""){$obj.$_ = $null}}
            }
            $usersnew = Get-ADGroupMember $name -Recursive  | Get-ADUser -Properties Name,Title,Department | Select Name,Title,Department
            Compare-Object -ReferenceObject $usersnew -DifferenceObject $usersold -Property Name,Title,Department | Sort-Object -Unique  | foreach {
                $tempname = $null
                if ($_.SideIndicator -ne "==")
                {
                   $tempname = $name
                   "В каталоге $tempname"
                   "изменилась строка: $_"
                }
                if ($tempname -ne $null)
                {
                    sendinfo -fss $tempname
                }
            }
        }
    }
    # если папка есть в старых данных, но её нет в AD, то надо её удалить из comparison.csv и удалить файл с именем этой папки
    else
    {
        $name = $_.name
        "Найдена устаревшая запись о папке: $name."
        $massive = @()
        $massiveold | foreach {
            if ($_.name -notcontains "$name")
            {
                $massive += $_
            }
        }
        $massive | export-csv -Path $changefailpath -Encoding UTF8 -NoTypeInformation
        "Файл $changefailpath обновлён. Запись $name удалена"
        dir $outcsvpath | where {$_.name -eq "$name.csv"} | Remove-Item
        "Файл $outcsvpath" + "$name" + ".csv удален"
    }
}
"Проверка завершена"
Ответить

Вернуться в «Скриптовые языки администрирования Windows»