Лучший отвечающий
Помогите разобраться со скриптом

Вопрос
-
Получение информации о характеристиках компьютеров в домене
При запуске скрипта мне просто выводится первый закомментированный абзац и больше ничего, файл не создается и другое не пишет:
<# 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 -полное имя файла отчета #>
Подскажите пожалуйста где почитать вот про этот параметр:
Quest.ActiveRoles.ArsPowerShellSnapIn.Data.IdentityParameter]
ЛИСТИНГ
<# 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 }
ывмывм
4 февраля 2019 г. 12:55
Ответы
-
вам в скрипт нужно подать -reportfilename без которого скрипт выводит справку
при этом файл репорта может не существовать, а вот каталог должен быть
пример выполнения .\script.ps1 -reportfilename c:\temp\filereport.txt
при этом c:\temp должен существовать
The opinion expressed by me is not an official position of Microsoft
- Изменено Vector BCOModerator 4 февраля 2019 г. 15:50
- Помечено в качестве ответа BkmzFIL 6 февраля 2019 г. 4:57
4 февраля 2019 г. 15:47Модератор
Все ответы
-
вам в скрипт нужно подать -reportfilename без которого скрипт выводит справку
при этом файл репорта может не существовать, а вот каталог должен быть
пример выполнения .\script.ps1 -reportfilename c:\temp\filereport.txt
при этом c:\temp должен существовать
The opinion expressed by me is not an official position of Microsoft
- Изменено Vector BCOModerator 4 февраля 2019 г. 15:50
- Помечено в качестве ответа BkmzFIL 6 февраля 2019 г. 4:57
4 февраля 2019 г. 15:47Модератор -
Читать про тип этого параметра вам не нужно, потому что реально он принимает строку с Distingushed Name контейнера, с которого начинать поиск : т.е. отлично преобразуется в нужный тип из строки с Distingushed Name (это видно из того, как создается значение по по умолчанию - Distinguished name домена).
PS А со скрипта я несколько удивляюсь: там совершенно непонятно зачем используется Quest'овский аналог команды из модуля ActiveDirectory и COM-объект ADSI - хотя всё нужное делается средствами стандартного модуля ActiveDirectory. Разве что, скрипт был написан в те древние времена, ещё когда этого модуля не было...
Слава России!
4 февраля 2019 г. 21:07 -
Разве что, скрипт был написан в те древние времена, ещё когда этого модуля не было...
Слава России!
"Posted by shs on 20 January 2011, 10:22 pm"
так и есть... тогда класический ад модуль был убогий
- Изменено Svolotch 5 февраля 2019 г. 8:27
5 февраля 2019 г. 8:27 -
вам в скрипт нужно подать -reportfilename без которого скрипт выводит справку
при этом файл репорта может не существовать, а вот каталог должен быть
пример выполнения .\script.ps1 -reportfilename c:\temp\filereport.txt
при этом c:\temp должен существовать
The opinion expressed by me is not an official position of Microsoft
Спасибо, странно то что я с параметром -reportfilename запускал скрипт, но папка была на рабочем столе, не хотел запускаться, всяко разно испробовал, создал на диске C папку temp запустил с параметром как у вас и заработало =\
- Изменено BkmzFIL 6 февраля 2019 г. 4:58
6 февраля 2019 г. 4:54 -
Читать про тип этого параметра вам не нужно, потому что реально он принимает строку с Distingushed Name контейнера, с которого начинать поиск : т.е. отлично преобразуется в нужный тип из строки с Distingushed Name (это видно из того, как создается значение по по умолчанию - Distinguished name домена).
PS А со скрипта я несколько удивляюсь: там совершенно непонятно зачем используется Quest'овский аналог команды из модуля ActiveDirectory и COM-объект ADSI - хотя всё нужное делается средствами стандартного модуля ActiveDirectory. Разве что, скрипт был написан в те древние времена, ещё когда этого модуля не было...
Слава России!
Можете направить на путь истинный? что почитать в этом направлении, хотел бы изучить ps для автоматизации6 февраля 2019 г. 4:55 -
вам в скрипт нужно подать -reportfilename без которого скрипт выводит справку
при этом файл репорта может не существовать, а вот каталог должен быть
пример выполнения .\script.ps1 -reportfilename c:\temp\filereport.txt
при этом c:\temp должен существовать
The opinion expressed by me is not an official position of Microsoft
и еще вопрос, для запуска опроса определенного контейнера в AD как правильно указать параметр "-SearchRoot" OU=test_PC_1c,OU=Office_PC,DC=mydomain , в папке Office_PC лежит папка test_PC_1c6 февраля 2019 г. 5:14 -
вам в скрипт нужно подать -reportfilename без которого скрипт выводит справку
при этом файл репорта может не существовать, а вот каталог должен быть
пример выполнения .\script.ps1 -reportfilename c:\temp\filereport.txt
при этом c:\temp должен существовать
The opinion expressed by me is not an official position of Microsoft
и еще вопрос, для запуска опроса определенного контейнера в AD как правильно указать параметр "-SearchRoot" OU=test_PC_1c,OU=Office_PC,DC=mydomain , в папке Office_PC лежит папка test_PC_1c
Нашел в справке :
PS C:\Users\user\Desktop\ps> .\CompsProperties.ps1 -SearchRoot 'mydomain/Office_PC/test_PC_1c' -reportfilename c:\temp\filereport.csv
6 февраля 2019 г. 5:27 -
Можете направить на путь истинный? что почитать в этом направлении, хотел бы изучить ps для автоматизации
у мс есть хороший официальный курс по powershell (платный, но базу дает неплохую)
есть так же несколько книг таких как Powershell in action и Powershell cookbook - где первая представляет из себя туториал по языку, а вторая на примерах задач (часто не тривиальных) показывает их решение.
при наличии базового понимания есть специфические курсы на microsoftvirtualacademy. а так же не стоит забывать про справку, где можно сначала найти нужный коммандлет через help *item*, a потом прочесть справку по нужному из них help get-item -full
The opinion expressed by me is not an official position of Microsoft
6 февраля 2019 г. 6:08Модератор -
и еще вопрос, для запуска опроса определенного контейнера в AD как правильно указать параметр "-SearchRoot" OU=test_PC_1c,OU=Office_PC,DC=mydomain , в папке Office_PC лежит папка test_PC_1c
Слава России!
6 февраля 2019 г. 18:47 -
Можете направить на путь истинный? что почитать в этом направлении, хотел бы изучить ps для автоматизации
у мс есть хороший официальный курс по powershell (платный, но базу дает неплохую)
есть так же несколько книг таких как Powershell in action и Powershell cookbook - где первая представляет из себя туториал по языку, а вторая на примерах задач (часто не тривиальных) показывает их решение.
при наличии базового понимания есть специфические курсы на microsoftvirtualacademy. а так же не стоит забывать про справку, где можно сначала найти нужный коммандлет через help *item*, a потом прочесть справку по нужному из них help get-item -full
The opinion expressed by me is not an official position of Microsoft
Можете подсказать как сделать, чтоб при выгрузке в форма csv все записывалось не в один столбец а в раздельные :
Get-WmiObject Win32_PhysicalMemory -ComputerName dell-it | Select-Object BankLabel, @{Name="Capacity, GB"; Expression={$_.Capacity/1GB}}, Manufacturer, SMBIOSMemoryType | Export-Csv -NoType c:\temp\result.csv
хотелось бы собрать информацию об оперативной памяти, в дальнейшем сделать массив который опрашивает все ПК в домене
7 февраля 2019 г. 8:53 -
Можете подсказать как сделать, чтоб при выгрузке в форма csv все записывалось не в один столбец а в раздельные :
Get-WmiObject Win32_PhysicalMemory -ComputerName dell-it | Select-Object BankLabel, @{Name="Capacity, GB"; Expression={$_.Capacity/1GB}}, Manufacturer, SMBIOSMemoryType | Export-Csv -NoType c:\temp\result.csv
хотелось бы собрать информацию об оперативной памяти, в дальнейшем сделать массив который опрашивает все ПК в домене
если вы про отображение то все зависит от того чем вы этот csv открываете
например ексель может правильно отобразить если зайти в закладку Data Разбивка по столбцам с разделителем запятая
The opinion expressed by me is not an official position of Microsoft
7 февраля 2019 г. 9:55Модератор -
Можете подсказать как сделать, чтоб при выгрузке в форма csv все записывалось не в один столбец а в раздельные :
Get-WmiObject Win32_PhysicalMemory -ComputerName dell-it | Select-Object BankLabel, @{Name="Capacity, GB"; Expression={$_.Capacity/1GB}}, Manufacturer, SMBIOSMemoryType | Export-Csv -NoType c:\temp\result.csv
хотелось бы собрать информацию об оперативной памяти, в дальнейшем сделать массив который опрашивает все ПК в домене
если вы про отображение то все зависит от того чем вы этот csv открываете
например ексель может правильно отобразить если зайти в закладку Data Разбивка по столбцам с разделителем запятая
The opinion expressed by me is not an official position of Microsoft
Спасибо8 февраля 2019 г. 5:21