2015-04-20 2 views
0

Я очень новичок в Powershell и не знаю, как собрать это вместе. Я ищу, чтобы получить список имен компьютеров, OU, в которых они находятся, и указать версию для конкретной программы.Получить ADComputers и установить установленное программное обеспечение

Я смог использовать команду Get-WMIObject для локального компьютера и фильтровать результаты для конкретной программы, которую я ищу.

Get-WMIObject -Class Win32_Product | Select-Object -Property name,version | Where-Object {$_.name -eq "Citrix Receiver Inside" 

Далее, я побежал это на нашем AD-сервере для имени компьютера и OU:

Get-ADComputer -Filter 'ObjectClass -eq "Computer"' | Select Expand Name, DistinguishedName 

Я пытаюсь трубы первого сценария Get-WmiObject ко второму 1, но я» m есть проблема ...

Таким образом, мой конечный результат должен состоять из 4 столбцов: имя компьютера, DistinguishedName (OU), название программы (все должны быть только Citrix Receiver Inside) и версия.

Я планировал использовать подстроку, такую ​​как команда в excel, чтобы получить имя OU в конце, но если есть способ получить имя OU на своем собственном в PS Script, это еще лучше.

Я разместил это на субредате PS, и они упомянули SCCM/SCOM; Я никогда не использовал его, если кто-то может предложить метод с теми, которые тоже будут крутыми.

Это сценарий, который был размещен на моей теме, но я до сих пор не получать результаты с этим:

 $computerList = Get-ADComputer -Filter 'ObjectClass -eq "Computer"' | Select-Object -Property DistinguishedName, Name 
foreach ($computer in $computerList) { 
Get-WMIObject -Class Win32_Product -computername $computer.name | Select-Object -Property name, version | where {$computer.name -eq "Citrix Receiver Inside"} 
} 
+0

Я не был в состоянии получить этот скрипт работает во времени, поэтому я взял долгий и утомительный подход вместо этого. Проблема решена, но любопытство все еще растет! Если кто-то может помочь мне исправить мой сценарий выше или альтернативный метод для получения желаемых результатов (имя компьютера, OU, имя программного обеспечения, версия №1), это было бы действительно потрясающе! Документация, которую я читал онлайн для powershell, действительно не объединяет ничего вместе ... Я могу нарисовать кучу строк, но как сделать это в картине? Знаете, что я имею в виду? – samalkobi

+0

Привет, Самал, я разместил ответ ниже. Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы, а также попробуйте это в своем домене. Я думаю, что это решит вашу проблему :) – FoxDeploy

ответ

0

Я думаю, что у вас возникли проблемы, потому что вы работаете Where-Object против неправильного значения здесь:

Get-WMIObject -Class Win32_Product -computername $computer.name | 
Select-Object -Property name, version | 
where {$computer.name -eq "Citrix Receiver Inside"} 

Get-WMIObject возвратит число бит информации о Win32_Product (установлено программное обеспечение), в том числе приложений GUID, имя программы, Версия программы и псевдоним или заголовок свойства.

В вашей команде Where-Object вы говорите «Дайте мне список программного обеспечения, где имя компьютера является„Citrix Receiver Inside“. В высшей степени маловероятно, что вы назвали компьютер, который :)

Попробуйте вместо этого:.

Get-WMIObject -Class Win32_Product -computername $computer.name | 
Select-Object -Property name, version | 
where {$_.name -eq "Citrix Receiver Inside"} 

Это даст вам список всех программного обеспечения под названием Citrix Receiver Inside

Интеграция

Теперь, чтобы интегрировать это в ваш скрипт в целом. Вы хотите получить список компьютеров, в которых есть этот продукт и этот продукт, а затем посмотреть имя comptuername, имя программы, версию программы, OU. Одна из проблем, с которой вы столкнетесь, заключается в том, что некоторые машины будут отключены, и вы не сможете своевременно связаться с ними.

Чтобы обойти эту проблему (что вызовет ошибки и уродливый красный текст), мы будем использовать блок Try/Catch, чтобы попытаться добраться до машины. Если машина не отвечает, мы запустим код в блоке Catch.

try {$product = Get-WMIObject -Class Win32_Product -computername $computer.name -ErrorAction Stop| 
    Select-Object -Property name, version | 
     where {$_.name -eq "Citrix Receiver Inside"} } 
catch{$product =[pscustomobject]@{Name="Citrix Receiver Inside";Version="Error"}} 

Целью здесь является создание объекта продукта, даже если машина не подключена к сети. Мы будем использовать это на следующем шаге сценария, где мы скажем: «Если бы компьютер ответил, то $ product.Version не будет равно« Ошибка », для всех этих парней выпишите, чтобы отобразить свойства, которые я хочу».

Закончено Код

$computerList = Get-ADComputer -Filter 'ObjectClass -eq "Computer"' | Select-Object -Property DistinguishedName, Name 
foreach ($computer in $computerList) { 

    try {$product = Get-WMIObject -Class Win32_Product -computername $computer.name -ErrorAction Stop| 
    Select-Object -Property name, version | 
     where {$_.name -eq "Citrix Receiver Inside"} } 
    catch{$product =[pscustomobject]@{Name="Citrix Receiver Inside";Version="Error"}} 

    if ($product.version -ne 'Error'){ 
    [pscustomobject]@{ComputerName=$computer.Name; 
     OU=$computer.DistinguishedName; 
     ProgramName=$product.name; 
     ProgramVersion=$product.version; 
     } 
    } 
} 

Пример вывода

enter image description here

+0

Спасибо миллион! Это похоже на работу! Я очень ценю ваш вклад! – samalkobi

Смежные вопросы