2016-08-03

Поиск живых компьютеров в Active Directory

Скрипт для поиска компов, которые меняли свой внутренний пароль в AD в течение последних трех дней:

1
2
3
4
5
6
7
8
9
Import-Module ActiveDirectory

$lastCheckDays = 3

$filter =  (get-date).AddDays(-$lastCheckDays).ToString("dd/MM/yyyy")
get-adcomputer `
            -filter "Passwordlastset -gt '$filter'" `
            -properties * `
            | Select name,passwordlastset,OperatingSystem

Выполнять лучше на контроллере соответствующего домена

Если требуется собрать и свести в один файл информацию о комьютерах из разных доменов, можно использовать такой скрипт
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Import-Module ActiveDirectory

$tempfile   = 'c:\temp\comp.csv.temp'
$resultfile = 'c:\temp\comp.csv'
 

function DoDomain($dc)
    {
    $lastCheckDays = 30 # Максимум дней с обновления пароля
    $filter =  (get-date).AddDays(-$lastCheckDays).ToString("dd/MM/yyyy")

    $error.clear()
    try {Get-ADDomain -server "$dc" | Out-Null } # проверка доступности контроллера
    catch {"[Error] $dc" }
    if (!$error){ # если контроллер доступен - понеслась...
        # Вытаскиваем список живых компов, 
        # экспортируем во временный файл, вырезая заголовки
        get-adcomputer `
                    -filter "Passwordlastset -gt '$filter'" `
                    -server "$dc"`
                    -properties name,CanonicalName,passwordlastset,OperatingSystem `
                    | Select name,CanonicalName,passwordlastset,OperatingSystem  `
                    | ConvertTo-Csv -NoTypeInformation `
                    | Select-Object -Skip 1 `
                    | Out-File "$tempfile" 

        #импортируем временный файл с другими заголовками, 
        $tmp = Import-Csv -Header Name,Domain,Date,OS $tempfile

        # из поля с указанием домена и OU компьютера вырезаем все кроме домена
        # для удобства фильтрации по домену например в экселе
        $tmp | ForEach-Object {$_.Domain = [regex]::replace($_.Domain,'/.*','') }

        # выбираем добавлять ли заголовок во временный файл. 
        # Добавляем, если результирующий файл еще не был создан и, следовательно
        # это первый обработанный домен. Записываем временный файл
        if (Test-Path "$resultfile") {
            $tmp | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Out-File "$tempfile" 
            } else {
            $tmp | ConvertTo-Csv -NoTypeInformation |  Out-File "$tempfile" 
            }

        # Добавляем временный файл в конец результирующего
        [System.IO.File]::ReadAllText("$tempfile") | Out-File "$resultfile" -Append 
        
        # пробегаемся по результирующему файлу, удаляя пустые строки 
        # (опять же важно для экселя, чтобы первую строку сделать фильром)
        [System.IO.File]::ReadAllText("$resultfile")  -replace '\s+\r\n+', "`r`n" |  Out-File "$resultfile"
        Remove-Item "$tempfile"
        }
    }




Remove-Item "$resultfile" 

DoDomain("dc.domain1.local")
DoDomain("dc.domain2.local")
DoDomain("dc.domain3.local")

Важно! На контроллерах доменов должна работать служба Active Directory Web Services.
Для контроллеров на Windows 2003, если данная служба не установлена, потребуется установить NET Framework 3.5 SP1, а также патч на фреймворк KB969166 (у микрософта доступен только через общение с саппортом так что выкладываю архив), ну и саму службу