Получение информации о характеристиках компьютеров в домене

Задачка стояла следующая: необходимо было получить отчет об аппаратных характеристиках компьютеров, которые являются членами домена. Нужно было собрать информацию о количестве и  объеме жестких дисков, объеме ОЗУ,  чипсете, процессоре, видеоадаптере, BIOS’е и т.п. Я решил, что так же не будет лишним собрать информацию и  о некоторых другие характеристиках: количестве разделов на жестком диске, параметрах файла подкачки, режима DEP и т.д. 

<# Get-CompsProperties.ps1 PowerShell 20101221 ShS http://shserg.ru

.Synopsys
    Получаем всевозможные данные о компьютерах в организации и сохраняем их в CSV-файле отчета

    Get-CompsProperties.ps1 [-SearchRoot <string>] [-SearchScope <string>]

.Parameter
	SearchRoot -	задает корневой контейнер, с которого будет начат поик учетных записей компьютеров,
					подлежащих опросу
					Если не задано иное, то по умолчанию принимает значение "$(([ADSI]"LDAP://rootDSE").rootDomainNamingContext)",
					которое равно DN корневого домена леса.

	SearchScope -	область поиска, может принимать одно из 3х возможных значений:
					'Base'     -	ограничивает область поиска базовым объектом (SearchRoot)
					'OneLevel' -	поиск только прямых потомков базового объекта (SearchRoot),
									за исключением самого базового объекта
					'Subtree' -		поиск по всему поддереву, начиная с базового объекта (SearchRoot),
									включая сам базовый объект
					Если не задано иное, то по умолчанию принимает значение 'Subtree'
	ReportFileName -полное имя файла отчета
#>
#================================================================================================================
param([Quest.ActiveRoles.ArsPowerShellSnapIn.Data.IdentityParameter]$SearchRoot="$(([ADSI]"LDAP://rootDSE").rootDomainNamingContext)",`
		[DirectoryServices.SearchScope]$SearchScope="Subtree", $ReportFileName)
#================================================================================================================
<###############################################################################

 Function Show-Help.	Выводит на экран первый блочный коментарий скрипта,
						заданного в качестве параметра вызова.

.Parameter <ScriptFullName>
	Полное имя скрипта, чей первый блочный коментарий будет выведен на экран.

#################################################################################>
Function Show-Help ($ScriptFullName){
	if ($ScriptFullName) {
		$IsHelpLine=$false
		switch -file $ScriptFullName {
			{$_ -match "<#"}     {Write-Host $_;$IsHelpLine=$true;continue}
			{$_ -match "#>"}     {Write-Host $_;$IsHelpLine=$false;break}
			{$IsHelpLine}        {Write-Host $_;}
		}
	}
}
<###############################################################################
.Function Get-CompProerties

.Synopsis
Функция Get-CompProperties предназначена для получения информации о характеристиках компьютера.

.Parameters
    CompName         - имя исследуемого компьютера

    PhisDrvCountEval - предполагоемое максимально возможное количество HDD
            Оценка количества физических дисков
            (предполагаемый максимум количества физмческих дисков в исследуемой системе)
            Именно такое количество полей будет отведено в объект-компьютер для хранения информации о жестких дисках
            (даже если этих дисков реально окажется меньше или больше этого нашего предположения)

#################################################################################>
Function Get-CompProerties ($CompName=".", $PhisDrvCountEval=2) {
    #
    #Создаем объект с полями, в котором будем хранитть свойства опрашиваемог окомпьютера
    $objComp=New-Object PSObject
    #Добавляем поля к объекту
    $objComp|Add-Member NoteProperty CompName -Value $null
    $objComp|Add-Member NoteProperty OSVersion -Value $null
    $objComp|Add-Member NoteProperty SPVersion -Value $null
    $objComp|Add-Member NoteProperty SystemDrive -Value $null
    $objComp|Add-Member NoteProperty InstallDate -Value $null
    $objComp|Add-Member NoteProperty DEPPol -Value $null
    $objComp|Add-Member NoteProperty PageFileInitSize -Value $null
    $objComp|Add-Member NoteProperty PageFileMaxSize -Value $null
    $objComp|Add-Member NoteProperty TotalPhysicalMemory -Value $null
    $objComp|Add-Member NoteProperty CPUName -Value $null
    $objComp|Add-Member NoteProperty PhisicalDrivesCount -Value $null
    #Добавмим столько полей для хранения информации о HDD, сколько мы
    #предполагали сохранить.
    for ($i=1;$i -le $PhisDrvCountEval;$i++) {
        Invoke-Expression $('$objComp|Add-Member NoteProperty PhisicalDrive'+ $i + 'Size -Value $null')
        Invoke-Expression $('$objComp|Add-Member NoteProperty PhisicalDrive'+ $i + 'Model -Value $null')
        Invoke-Expression $('$objComp|Add-Member NoteProperty PhisicalDrive'+ $i + 'Partitions -Value $null')
    }
    $objComp|Add-Member NoteProperty SysDrvSize -Value $null
    $objComp|Add-Member NoteProperty SysDrvFreeSpace -Value $null
    $objComp|Add-Member NoteProperty VideoControllerName -Value $null
    $objComp|Add-Member NoteProperty VideoControllerRAM -Value $null
    $objComp|Add-Member NoteProperty Chipset -Value $null
    $objComp|Add-Member NoteProperty SMBIOSBIOSVersion -Value $null
    $objComp|Add-Member NoteProperty BIOSManufacturer -Value $null
    $objComp|Add-Member NoteProperty BIOSName -Value $null
    $objComp|Add-Member NoteProperty BIOSSerialNumber -Value $null
    $objComp|Add-Member NoteProperty BIOSVersion -Value $null
    #
    #======================= Здесь начинаем заполнять поля объекта ==========================
    #
    #Имя компьютера
    $OS=gwmi win32_OperatingSystem -ComputerName $CompName -ErrorAction Stop
    $objComp.CompName=$OS.CSName
    #Версия OS И ServicePack'а
    $objComp.OSVersion=$OS.Version
    $objComp.SPVersion=$OS.ServicePackMajorVersion
    #Дата/время установки ОС
    $objComp.InstallDate=([WMI]'').ConvertToDateTime($OS.InstallDate)
    #Политика DEP
    $objComp.DEPPol=$OS.DataExecutionPrevention_SupportPolicy
    #Имя SystemDrive
    $objComp.SystemDrive=$OS.SystemDrive
    #Минимальный/Максимальный размеры файла подкачки
    $PageFile=gwmi win32_pagefilesetting  -ComputerName $CompName
    $objComp.PageFileInitSize=$PageFile.InitialSize
    $objComp.PageFileMaxSize=$PageFile.MaximumSize
    #Доступный объем ОЗУ
    $objComp.TotalPhysicalMemory=[math]::Round((gwmi Win32_ComputerSystem  -ComputerName $CompName -ErrorAction Stop).TotalPhysicalMemory/1gb,3)
    #Название ЦПУ
    $objComp.CPUName=(gwmi Win32_Processor  -ComputerName $CompName -ErrorAction Stop).Name
	if ($objComp.CPUName) {$objComp.CPUName=$objComp.CPUName.Trim()}
    #Информация о физических дисках
    $PhisicalDrives=@(gwmi win32_diskdrive -ComputerName $CompName -ErrorAction Stop| select Model,Size, Partitions)
    $objComp.PhisicalDrivesCount=$PhisicalDrives.Count
    #Заполним поля информацией о HDD
    for ($i=1;$i -le [math]::min($PhisDrvCountEval, $PhisicalDrives.Count);$i++) {
        Invoke-Expression $('$objComp.PhisicalDrive'+ $i + 'Model=$PhisicalDrives[$i-1].Model')
        Invoke-Expression $('$objComp.PhisicalDrive'+ $i + 'Size=[math]::Round($PhisicalDrives[$i-1].Size/1gb, 3)')
        Invoke-Expression $('$objComp.PhisicalDrive'+ $i + 'Partitions=$PhisicalDrives[$i-1].Partitions')
    }
    #Информация о системном разделе...
    $SystemDriveInfo=gwmi Win32_LogicalDisk -ComputerName $CompName -ErrorAction Stop|?{$_.DeviceID -eq $OS.SystemDrive}
    ##...размер и...
    $objComp.SysDrvSize=[math]::Round($SystemDriveInfo.Size/1gb,3)
    ##...свободное место
    $objComp.SysDrvFreeSpace=[math]::Round($SystemDriveInfo.FreeSpace/1gb,3)
    #Информация о видеоадаптере
    $VideoController=gwmi Win32_VideoController -ComputerName $CompName -ErrorAction Stop
    $objComp.VideoControllerName=$VideoController.Name
    $objComp.VideoControllerRAM=[math]::Round($VideoController.AdapterRAM/1mb,3)
    #Информация о Chipset'е
    #(исходим из предположения, что все опрашиваемые компьюторы имееют мат плату на chipset'ах Intel
    #и на них установлены драйвера Inf-updates)
    $Chipset= gwmi Win32_PnPEntity -ComputerName $CompName -ErrorAction Stop| Out-String -Stream|
    Select-String ".*intel.*\s([^\d/\s]{0,2}\d{2,5}[^\d/\s]{0,2})/"| select -First 1
    if ($Chipset) {$ObjComp.Chipset=$Chipset.Matches[0].Groups[1].Value}
    #Информация о BIOS
    $BIOS=gwmi Win32_BIOS -ComputerName $CompName -ErrorAction Stop
    $objComp.SMBIOSBIOSVersion=$BIOS.SMBIOSBIOSVersion
    $objComp.BIOSManufacturer=$BIOS.Manufacturer
    $objComp.BIOSName=$BIOS.Name
    $objComp.BIOSSerialNumber=$BIOS.SerialNumber
    $objComp.BIOSVersion=$BIOS.Version
    #Вовращем objComp, в качестве результата работы функции
    $objComp
}
#
#================= Точка входа скрипта ==================================
cls
if (($ReportFileName) -and (Test-Path ($ReportFileName|Split-Path))) {
	Write-Host $(Get-Date)
	#
	$VerbosePreference = "Continue"
	#Папка, из которой был запущен скрипт
	$ScriptPath=Split-Path $MyInvocation.MyCommand.Path
	#Полное имя файла-отчета
	#$ReportFileName="$ScriptPath\1.csv"
	#Если существует старый отчет, то...
	if (Test-Path $ReportFileName) {
	    #...загрузим данные из него в хэш-таблицу
	    $ReportHash=import-csv $ReportFileName -UseCulture| group -AsHashTable CompName
	}
	#Создадим пустой массив, в который будем собирать информацию об опрашиваемых компьютерах
	$DomainCompsProps=@()
	#аналогично, создаем массив для формирования лог-файла выполнения скрипта
	$PollLog=@()
	#Зададим корневое OU, с которого будет начат поиск компьютеров
	#$SearchRoot="OU=MySubOU,OU=MyOU,OU=Workstations,DC=domain,DC=local"
	#Выбираем из заданной ветки все незаблокированные компьютеры
	$Comps = Get-QADComputer -IncludedProperties lastLogontimeStamp -ErrorAction SilentlyContinue -SearchRoot $SearchRoot -SearchScope $SearchScope -SizeLimit 0 |
	 	select name, lastLogontimeStamp, Description, whenCreated, @{Name="Disabled"; Exp={$_.useraccountcontrol -band 2}}|
		?{$_.Disabled -eq 0}
	#Перебираем все компьютеры и получаем их свойства
	foreach ($Comp in $Comps) {
		#создаем объект для сбора информации о процессе опроса компьютера (логирование опроса)
		#и заполняем его поля значениями
		$objPol=New-Object PSObject
		$objPol|Add-Member NoteProperty CompName -Value $Comp.Name
		$objPol|Add-Member NoteProperty Description -Value $Comp.Description
		$objPol|Add-Member NoteProperty ErrorNumber -Value 0
		$objPol|Add-Member NoteProperty whenCreated -Value $Comp.whenCreated
		$objPol|Add-Member NoteProperty lastLogonTimeStamp -Value $Comp.lastLogontimeStamp
		$objPol|Add-Member NoteProperty PollDate -Value (Get-Date)
		#
		#
	    $PollingError=$false
	  	if (Test-Connection $Comp.Name -Count 1 -Quiet) {
			try {
				#Write-Host "CompName=",$Comp.Name, "  CompDescription=", $Comp.Description #, "  LoggedonUser=", $LoggedonUserName
	            Write-Host "$("CompName= {0,-15} CompDescription= {1,-20}" -f $Comp.Name, $Comp.Description)"
	            $CurCompProps=Get-CompProerties -CompName $Comp.Name
	            #Добавим еще несколько полей к объекту со свойствами компьютера
	            ## Добавляем Description
	            $CurCompProps| Add-Member NoteProperty Description -Value $Comp.Description
	            ## Добавляем lastLogonTimeStamp
	            $CurCompProps| Add-Member NoteProperty lastLogonTimeStamp -Value $Comp.lastLogontimeStamp
	            ## Добавляем whenCreated
	            $CurCompProps| Add-Member NoteProperty whenCreated -Value $Comp.whenCreated
	            ##Добавляем дату сбора информации
	            $CurCompProps| Add-Member NoteProperty ReportDate -Value (Get-Date)
	            #$DomainCompsProps[$CurCompProps.CompName]=$CurCompProps
	            $DomainCompsProps+=$CurCompProps
	        }
			catch {
	            $PollingError=$true
				#если компьютер пингуется, но его не удалось опросить, то в лог помещаем Error #5
				$objPol.ErrorNumber=5
				Write-Verbose "$("Ошибка доступа к компьютеру CompName= {0,-15}  CompDescription= {1,-20} LastLogonTimeStamp= {2,8}" -f $Comp.Name, $Comp.Description, $Comp.lastLogontimeStamp.ToString("yyyyMMdd"))"
			}
	 	}
	    else {
	        $PollingError=$true
	        #если компьютер не пингуется, то в лог идет Error #1
			$objPol.ErrorNumber=1
	        Write-Verbose "$("Компьютер CompName= {0,-15}  CompDescription= {1,-20} не пингуется. LastLogonTimeStamp= {2,8}" -f $Comp.Name, $Comp.Description, $Comp.lastLogontimeStamp.ToString("yyyyMMdd"))"
	    }
	    #Если произошла ошибка во время опроса компьютера,
	    #а в старом отчете информация об этом компьютере имеется...
	    if ($PollingError -and $ReportHash) {
            if ($ReportHash[$Comp.Name]) {
	           #..., то добавим эту информацию к формируемому отчету
	           $DomainCompsProps+=$ReportHash[$Comp.Name]
            }
	    }
		$PollLog+=$objPol
	}
	if ($DomainCompsProps) {
		Write-Host "Выгружаем результаты в файл отчета.."
		# Выгружаем результат в файл
		$DomainCompsProps| Export-Csv -Path $ReportFileName -UseCulture #-Delimiter ";"
		Write-Host $(Get-Date)
	}
	else {
		Write-Host "Данных для формирования отчета собрать не удалось!"
	}
	#Если лог-объект не пустой, то выгружаем его в лог-файл
	if ($PollLog) {
		$PollLog| Export-Csv -Path ((Split-Path $ReportFileName)+"\log.csv") -UseCulture
	}
	Write-Host "Работа завершена!"
}
else {
	#Выводим на экран первый блочный комментарий этого скрипта в качестве справки
	Show-Help $MyInvocation.MyCommand.Path
}

 Скрипт построен по той же схеме, что и предыдущий («Скрипт для получения отчета о событиях входа/выхода на компьютерах домена»): 

В качестве входных параметров скрипту предается: имя OU, с которого будет начат поиск учетных записей компьютеров (подлежащих опросу); глубина опроса; имя файла отчета. 

param([Quest.ActiveRoles.ArsPowerShellSnapIn.Data.IdentityParameter]$SearchRoot="$(([ADSI]"LDAP://rootDSE").rootDomainNamingContext)",`
[DirectoryServices.SearchScope]$SearchScope="Subtree", $ReportFileName)

При помощи командлетов от Quest Software получаем перечень неотключенных учетных записей компьютеров в заданном OU. 

$Comps = Get-QADComputer -IncludedProperties lastLogontimeStamp -ErrorAction SilentlyContinue -SearchRoot $SearchRoot -SearchScope $SearchScope -SizeLimit 0 |
	 	select name, lastLogontimeStamp, Description, whenCreated, @{Name="Disabled"; Exp={$_.useraccountcontrol -band 2}}|
		?{$_.Disabled -eq 0}

Затем, при помощи функции Get-CompProerties выполняем опрос каждого компьютера в полученном списке. Результатом работы функции является вновь созданный временный объект, чьи поля заполнены результатами опроса заданного компьютера. Очень важно, что временный объект всякий раз создается заново. (Присвоение объектов и массивов в PowerShell происходит по ссылке, поэтому, если бы мы не создавали бы новый объект всякий раз, а просто бы изменяли значения полей (свойств) единожды созданного объекта, то, тем самым, мы изменяли бы значения полей всех других объектов, которым ранее выполняли присваивание этого временного объекта) 

    #Создаем объект с полями, в котором будем хранитть свойства опрашиваемог окомпьютера
    $objComp=New-Object PSObject
    #Добавляем поля к объекту
    $objComp|Add-Member NoteProperty CompName -Value $null
    $objComp|Add-Member NoteProperty OSVersion -Value $null
    $objComp|Add-Member NoteProperty SPVersion -Value $null
    $objComp|Add-Member NoteProperty SystemDrive -Value $null
    $objComp|Add-Member NoteProperty InstallDate -Value $null
    $objComp|Add-Member NoteProperty DEPPol -Value $null
    $objComp|Add-Member NoteProperty PageFileInitSize -Value $null
    $objComp|Add-Member NoteProperty PageFileMaxSize -Value $null
    $objComp|Add-Member NoteProperty TotalPhysicalMemory -Value $null
    $objComp|Add-Member NoteProperty CPUName -Value $null
    $objComp|Add-Member NoteProperty PhisicalDrivesCount -Value $null
    #Добавмим столько полей для хранения информации о HDD, сколько мы
    #предполагали сохранить.
    for ($i=1;$i -le $PhisDrvCountEval;$i++) {
        Invoke-Expression $('$objComp|Add-Member NoteProperty PhisicalDrive'+ $i + 'Size -Value $null')
        Invoke-Expression $('$objComp|Add-Member NoteProperty PhisicalDrive'+ $i + 'Model -Value $null')
        Invoke-Expression $('$objComp|Add-Member NoteProperty PhisicalDrive'+ $i + 'Partitions -Value $null')
    }
    $objComp|Add-Member NoteProperty SysDrvSize -Value $null
    $objComp|Add-Member NoteProperty SysDrvFreeSpace -Value $null
    $objComp|Add-Member NoteProperty VideoControllerName -Value $null
    $objComp|Add-Member NoteProperty VideoControllerRAM -Value $null
    $objComp|Add-Member NoteProperty Chipset -Value $null
    $objComp|Add-Member NoteProperty SMBIOSBIOSVersion -Value $null
    $objComp|Add-Member NoteProperty BIOSManufacturer -Value $null
    $objComp|Add-Member NoteProperty BIOSName -Value $null
    $objComp|Add-Member NoteProperty BIOSSerialNumber -Value $null
    $objComp|Add-Member NoteProperty BIOSVersion -Value $null

К полученному объекту добавляем несколько полей с информацией об учетной записи опрашиваемого компьютера, которую можно извлечь из AD. 

	            #Добавим еще несколько полей к объекту со свойствами компьютера
	            ## Добавляем Description
	            $CurCompProps| Add-Member NoteProperty Description -Value $Comp.Description
	            ## Добавляем lastLogonTimeStamp
	            $CurCompProps| Add-Member NoteProperty lastLogonTimeStamp -Value $Comp.lastLogontimeStamp
	            ## Добавляем whenCreated
	            $CurCompProps| Add-Member NoteProperty whenCreated -Value $Comp.whenCreated
	            ##Добавляем дату сбора информации
	            $CurCompProps| Add-Member NoteProperty ReportDate -Value (Get-Date)
	            #$DomainCompsProps[$CurCompProps.CompName]=$CurCompProps
	            $DomainCompsProps+=$CurCompProps

Понятно, что существует далеко не нулевая вероятность того, что не все компьютеры, попавшие в список, скрипту удастся опросить (они могут быть выключены, неисправны и т.п.). Так же понятно, что в разные моменты времени могут быть выключены разные компьютеры и, запуская скрипт раз за разом, мы будем получать информацию от разного набора компьютеров. Чтобы информация, собранная скриптом во время предыдущих запусков, не терялась, скрипт проверяет существование файла отчета. Если таковой существует, то информация, которая в нем содержится, будет не перезаписана, а обновлена и дополнена.

	#Если существует старый отчет, то...
	if (Test-Path $ReportFileName) {
	    #...загрузим данные из него в хэш-таблицу
	    $ReportHash=import-csv $ReportFileName -UseCulture| group -AsHashTable CompName

 

     #Если произошла ошибка во время опроса компьютера,
     #а в старом отчете информация об этом компьютере имеется...
     if ($PollingError -and $ReportHash) {
            if ($ReportHash[$Comp.Name]) {
            #..., то добавим эту информацию к формируемому отчету
            $DomainCompsProps+=$ReportHash[$Comp.Name]
            }
     }

Кроме того скрипт формирует, выводит на экран информацию о процессе опроса, а так же формирует лог log.csv в той же папке, в которой формируется файл отчета. Лог файл содержит информацию о том, удалось ли опросить компьютер (в этом случае поле ErrorNumber принимает значение 0), компьютер не отвечал на ping’и (ErrorNumber равен 1)  или было отказано в доступе (ErrorNumber равен 5). 

		#создаем объект для сбора информации о процессе опроса компьютера (логирование опроса)
		#и заполняем его поля значениями
		$objPol=New-Object PSObject
		$objPol|Add-Member NoteProperty CompName -Value $Comp.Name
		$objPol|Add-Member NoteProperty Description -Value $Comp.Description
		$objPol|Add-Member NoteProperty ErrorNumber -Value 0
		$objPol|Add-Member NoteProperty whenCreated -Value $Comp.whenCreated
		$objPol|Add-Member NoteProperty lastLogonTimeStamp -Value $Comp.lastLogontimeStamp
		$objPol|Add-Member NoteProperty PollDate -Value (Get-Date)

 

				#если компьютер пингуется, но его не удалось опросить, то в лог помещаем Error #5
 $objPol.ErrorNumber=5

 

	        #если компьютер не пингуется, то в лог идет Error #1
 $objPol.ErrorNumber=1

Пример результата работы скрипта и лог-файла, создаваемого в процессе его работы см. ниже: 

Report

Log

27 Comments

    • Спасибо за замечание. Надеюсь, что пофиксил ;). Имя admin было забито в настройках плагина, который я пользую (“Subscribe to comments”). Теперь рассылка должна приходить от имени ShS’s blog. Буду благодарен за любые замечания, указывающие на мои недоработки.

  1. Только начинаю изучать PS, по этому далеко не посылайте :). Вот не пойму при запуске вашего скрипта ничего не выходит на экран, но эта запись Write-Host “Работа завершена!” говорит о том что должно выводиться сообщение “Работа завершена!”, и не могу понять куда сохроняется лог и с каким именем?

    • >и не могу понять куда сохроняется лог и с каким именем?
      Имя файла-отчета задается в параметре ReportFileName

      Пример вызова скрипта: .\Get-CompsProperties.ps1 -ReportFileName .\MyReport.csv

  2. Еще вопрос, у компов дискрипшины прописани кириллицай, а в файле отчета эти поля место букв ????. как можно исправить?

    • Для экспорта собранной информации в файл скрипт использует командлет Export-CSV. У этого командлета имеется параметр -Encoding. Попробуйте при помощи него установить нужную вам кодировку.

  3. Сергей, добрый день, не нашел контактов на сайте поэтому пишу сюда, посоветуйте какую-нибудь литературы с примерами для полных чайников по PowerShell…

    • Здравствуйте.
      IMHO, самая лучшая книжка по PoSh – это “Windows PowerShell in Action” by Bruce Payette – замечательно написана.
      Второй книгой в моем рейтинге будет “Windows PowerShell Cookbook” by Lee Holmes
      Третья – “Введение в PowerShell” Андрея Попова.
      Все эти книжки разноплановые. Только первая выделяется тем, что может использоваться, как учебник с большой буквы. Вторая – набор примеров на все случаи жизни. Своеобразный “Tips and tricks”. Третья – стандартное учебное пособие – справочник (без излишеств). Первые 2 книги вышли уже в 2х редакциях, будьте внимательны.

  4. Pingback: Сбор информации об установке “заплаток” (HotFix’ов) в ОС Windows (на примере HotFix’ов из бюллетеня безопасности MS12-020) « « ShS's Blog

  5. Здравствуйте, очень понравился ваш блог, несколько скриптов уже взял на заметку, но с этим чет никак не разберусь:
    Запускаю скрипт на локальной машине в консоли ActiveRoles Management Shell for Active Directory с правами админа, с единственным параметром -RportFileName, но скрипт судя по выводимой “справке” вместо “Работа завершена” выполняется с ошибкой, в чем может быть причина? что я делаю не так? :))

  6. “Невозможно найти тип [Quest.ActiveRoles.ArsPowerShellSnapIn.Data.IdentityParameter]: убедитесь в том, что сборка, содержащая этот тип, загружена.”

    Нужно ли устанавливать какие-то сторонние сборки для работы данного скрипта? Или природа данной ошибки в чем-то другом?

    • Прошу прощения за невежество, просто не увидел, что где-то указана необходимость установленного пакета Activeroles management shell for active directory. А так, огромное спасибо, скрипт супер полезен!

  7. Добрый день. Будьте добры – подскажите, как правильно задать параметр -searchroot
    Например имя ветки домена где я являюсь админом OU=04-ohil,DC=xyz,DC=xrom,DC=ru
    Пишу так : .\script.ps1- SearchRoot 04-ohil -ReportFileName .\MyReport.csv
    Вроде бы съедает – но пишет
    Данных для формирования отчета собрать не удалось!
    Работа завершена!
    если ничего не указываю, то отрабатывает но на весь лес xyz.xrom.ru

    • Посмотрите справку по командлету Get-QADComputer: help Get-QADComputer -full, там вы увидите какие значения может принимать этот параметр

  8. Уважаемый shs, а возможно ли скрипт отредактить чтобы использовать встроенные командлеты Posh AD ?

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

Leave a Reply

Your email address will not be published. Required fields are marked *

Notify me of followup comments via e-mail. You can also subscribe without commenting.