none
Получение списка ПК с АД со скрипта RRS feed

  • Вопрос

  • Всем привет. Есть скрипт, который получает список ПК, Get-ADComputer -Filter {OperatingSystem -like '*' -and Enabled -eq $true -and Name -like 'w*'} -Properties OperatingSystem. Если я запускаю скрипт, который содержит эту команду, то получаю ошибку:

    Get-ADComputer : Не удается установить связь с сервером. Возможные причины: сервер не существует, выключен или на нем не запущены веб-службы Active Directory.

    Но если эту же команду запустить из консоли, то она нормально выполняется. Что не так?

    16 июня 2015 г. 5:38

Ответы

  • $pcs = Get-ADComputer -Filter {OperatingSystem -like '*' -and Enabled -eq $true} -Properties OperatingSystem | Foreach {
     $o = $_.OperatingSystem
     $_ | Get-ActivationStatus  | Select ComputerName,Status,Type,@{n="OperatingSystem";e={$o}}
    }

    заменить на:

    $filter = "(&(objectclass=computer)(dnshostname=*)(!operatingsystem=Windows XP Professional)(name=w*)(!userAccountControl:1.2.840.113556.1.4.803:=2))"
    $pcs = ([adsisearcher]$filter).FindAll() | Foreach {
    	$o = $_.Properties.Item("operatingsystem")
    	$_.Properties.Item("dnshostname") | Get-ActivationStatus  | Select ComputerName,Status,Type,@{n="OperatingSystem";e={$o}} 
    }
    

    • Помечено в качестве ответа Net Ranger 17 июня 2015 г. 11:05
    17 июня 2015 г. 8:36
    Отвечающий

Все ответы

  • "Если я запускаю скрипт, который содержит эту команду, то получаю ошибку
    ...
    Но если эту же команду запустить из консоли, то она нормально выполняется"

    Это как? Где как не в консоли выполнять эту команду?

    16 июня 2015 г. 6:33
    Модератор
  • Ну, т.е. я в консоли запускаю скрипт, .\script.ps1, который содержит эту команду, и получаю ошибку. А потом уже в самой консоли выполняю отдельно саму команду.

    PS D:\> .\script.ps1 

    и

    PS D:\> Get-ADComputer -Filter {OperatingSystem -like '*' -and Enabled -eq $true -and Name -like 'w*'} -Properties OperatingSystem
    • Изменено Net Ranger 16 июня 2015 г. 6:51
    16 июня 2015 г. 6:50
  • что стоит в executionpolicy?

    Консоль от админа запущена?

    16 июня 2015 г. 7:22
    Модератор
  • что стоит в executionpolicy?

    Консоль от админа запущена?

    RemoteSigned (скрипт запускается на том же ПК, где он и был написан)

    Консоль да, от админа.


    16 июня 2015 г. 7:52
  • Контроллер домена должен быть 2008 R2+(за исключением 2003,2008 если стоит ADWS). Поэтому для проверки можно задать параметр - Server ИМЯDC или IP-адрес:

    Get-ADComputer ..... -Server dc.mydomain.com


    Ps. И соответственно сессия должна быть локальная, а не через PowerShell Remoting.
    • Изменено KazunEditor 16 июня 2015 г. 8:17
    16 июня 2015 г. 8:15
    Отвечающий
  • Наш КД 2008 R2. Но опять же - отдельной командой забираю список ПК нормально, через скрипт нет. Оба случая - powershell remoting.


    • Изменено Net Ranger 16 июня 2015 г. 9:56
    16 июня 2015 г. 9:55
  • Наш КД 2008 R2. Но опять же - отдельной командой забираю список ПК нормально, через скрипт нет. Оба случая - powershell remoting.


    Научитесь читать в конце концов и перестать врать,еще раз должна быть локальная сессия,а не PowerShell Remoting.

    Для получение гемороя,  требуется настроить CredSSP на всех машинах, где требуется Double Hop - https://msdn.microsoft.com/en-us/library/ee309365(v=vs.85).aspx , хотя явно PS Remoting для данной команды не нужен. Как настроить CredSSP - http://blogs.msdn.com/b/clustering/archive/2009/06/25/9803001.aspx

    16 июня 2015 г. 10:02
    Отвечающий
  • Т.е. https://social.technet.microsoft.com/Forums/ru-RU/de976e88-5a99-402b-9865-ad83ad8fa921/-foreach?forum=scrlangru#11cbed0d-7436-47f1-a583-6951f6577513 надо выполнять на КД?
    16 июня 2015 г. 10:28
  • 1) От доменного аккаунта

    2) На машине должен установлен быть Excel

    3) Может быть любая доменная машина

    4) Для скрипта не важно настроен ли PS Remoting

    5) Аккаунт от которого запускается скрипт,  должен иметь права на удаленных машинах эквивалентным локальному администратору.

    16 июня 2015 г. 10:33
    Отвечающий
  • Самое смешное, что все эти условия выполнены (запуск скрипта происходит от доменного админа). Но вот получить список ПК скрипт не может. Если что, на части ПК часть скрипта, вручную (там где цикл с get-adcomputer ...) успешно отрабатывает, но это уже другая история. Поэтому проблема не в правах.
    • Изменено Net Ranger 16 июня 2015 г. 10:52
    16 июня 2015 г. 10:45
  • Еще раз скрипт должен выполняться локально, а не через PS Remoting.

    16 июня 2015 г. 10:54
    Отвечающий
  • 3) Может быть любая доменная машина

    Чёт я запутался... Под этой фразой "Может быть любая доменная машина", я так понял, Вы подразумеваете любую машину к которой будет применяться скрипт или же с которой будет запрос в АД на получение списка ПК?

    Потому что иначе, я так понимаю, скрипт надо запускать локально на КД, так?

    16 июня 2015 г. 11:25
  • Любая доменная машина с установленным Excel, где в локальной сессии(без использования PS Remoting)с правами доменного администратора будет запущен скрипт . Данный скрипт выполнит удаленное подключение к машинам, которые были получены из запроса Get-Computer.

     
    16 июня 2015 г. 11:35
    Отвечающий
  • Если я Вас правильно понял, то я вроде как делаю всё верно - со своего ПК, под учетной записью доменного администратора, локально запускаю скрипт. Что еще посмотреть\проверить? Excel стоит.
    • Изменено Net Ranger 16 июня 2015 г. 13:18
    16 июня 2015 г. 13:17
  • Скрин экрана, где данная ошибка с полным ее описанием. Скрипт должен быть в первоначальном виде без изменений или приложить эти изменения.
    16 июня 2015 г. 13:20
    Отвечающий
  • Изменения не вносил.

    16 июня 2015 г. 13:26
  • Вывод ошибки при указании параметра Server:

    Get-ADComputer .... -Server myDc.domain.ru

    16 июня 2015 г. 13:29
    Отвечающий
  • Изменил в скрипте строку Get-ADComputer -Filter {OperatingSystem -notlike 'Windows XP Professional' -and Enabled -eq $true -and Name -like 'w*'} -Properties OperatingSystem на Get-ADComputer -Filter {OperatingSystem -notlike 'Windows XP Professional' -and Enabled -eq $true -and Name -like 'w*'} -Properties OperatingSystem -server dc01.domain.com - не помогло. И почему-то теперь появились ошибки с Excel, хоть я и импортировал модуль.
    • Изменено Net Ranger 17 июня 2015 г. 6:52
    17 июня 2015 г. 6:52
  • Перед $pcs = Get-ADComputer добавить строку и приложить скрин:

    Write-Host $host.Name _ $host.Runspace.ApartmentState _ $host.Version

    17 июня 2015 г. 7:01
    Отвечающий
  • Скрин ошибки, вместо Write-Host, строчку:

    ([adsisearcher]"(&(objectclass=computer)(!operatingsystem=Windows XP Professional)(name=w*)(!userAccountControl:1.2.840.113556.1.4.803:=2))").FindAll()

    17 июня 2015 г. 8:03
    Отвечающий
  • В этот раз ошибки нет... во всяком случае во время отработки строчки выше. Скрин:

    А не, ошибка осталась. Та же.

    • Изменено Net Ranger 17 июня 2015 г. 8:40
    17 июня 2015 г. 8:26
  • $pcs = Get-ADComputer -Filter {OperatingSystem -like '*' -and Enabled -eq $true} -Properties OperatingSystem | Foreach {
     $o = $_.OperatingSystem
     $_ | Get-ActivationStatus  | Select ComputerName,Status,Type,@{n="OperatingSystem";e={$o}}
    }

    заменить на:

    $filter = "(&(objectclass=computer)(dnshostname=*)(!operatingsystem=Windows XP Professional)(name=w*)(!userAccountControl:1.2.840.113556.1.4.803:=2))"
    $pcs = ([adsisearcher]$filter).FindAll() | Foreach {
    	$o = $_.Properties.Item("operatingsystem")
    	$_.Properties.Item("dnshostname") | Get-ActivationStatus  | Select ComputerName,Status,Type,@{n="OperatingSystem";e={$o}} 
    }
    

    • Помечено в качестве ответа Net Ranger 17 июня 2015 г. 11:05
    17 июня 2015 г. 8:36
    Отвечающий
  • Спасибо, конкретно старая ошибка ушла. Можете только сказать, какой параметр в выражении переменной $filter эквивалентен searchbase командлета get-adcomputer?
    17 июня 2015 г. 11:05
  • SearchRoot:

    $filter = "(&(objectclass=computer)(dnshostname=*)(!operatingsystem=Windows XP Professional)(name=w*)(!userAccountControl:1.2.840.113556.1.4.803:=2))"
    $sr = [adsisearcher]$filter
    $sr.SearchRoot = [ADSI]"LDAP://OU=MYOU,DC=Domain,DC=ru"
    
    $pcs = $sr.FindAll() | Foreach {
    	$o = $_.Properties.Item("operatingsystem")
    	$_.Properties.Item("dnshostname") | Get-ActivationStatus  | Select ComputerName,Status,Type,@{n="OperatingSystem";e={$o}} 
    }

    17 июня 2015 г. 11:13
    Отвечающий
  • То что надо. Спасибо!
    17 июня 2015 г. 11:26