none
Получить список CompName IPaddress из AD и DNS в виде CSV RRS feed

  • Вопрос

  • Подскажите, как можно осуществить subj с помощью PowerShell?

    Большую часть написать мне удалось:

    cls
    # Зададим количество дней, прошедших с последнего логона
    $LastLogon = (get-date).AddDays(-5).ToFileTime()
    #
    #Определим LDAP-фильтр для запроса
    $Filter = "(&(objectcategory=computer)(|(lastLogonTimestamp<=$LastLogon)(!(lastLogonTimestamp=*))))"

    $objDomain = New-Object System.DirectoryServices.DirectoryEntry

    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = $objDomain
    $objSearcher.Filter = ($Filter)

    $colProplist = "name"
    foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}

    $colResults = $objSearcher.FindAll()

    foreach ($objResult in $colResults)
        {$objComputer = $objResult.Properties;
         $objComputer.name
         $result = [system.Net.Dns]::GetHostByName($objComputer.name)
         $result.AddressList | ForEach-Object {$_.IPAddressToString }
         $res = $result.AddressList
        }

    Проблема-же заключатеся в том что этот список выводится построчно разными переменными, а мне надо как-то загнать их в одну переменную, чтобы затем экспортировать с помощью export-csv ().

    19 июля 2010 г. 13:21

Ответы

  • >Проблема-же заключатеся в том что этот список выводится построчно разными переменными, а мне надо как-то загнать их в одну переменную,
    Не совсем верно сформулировано, вам просто надо вывести данные в виде объектов. Например один из способов выглядит так:

    foreach ($objResult in $colResults)
        {$objComputer = $objResult.Properties;
         $objComputer.name
         $result = [system.Net.Dns]::GetHostByName($objComputer.name)
         $result.AddressList | ForEach-Object {$_.IPAddressToString }
         $obj = new-object psobject -property @{
            Name = $ObjComputer.Name
            IPAddresses = $result.AddressList
         }
        }

    Еще варианты тут: http://xaegr.wordpress.com/2009/10/22/new-object/


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Предложено в качестве ответа Vasily GusevModerator 19 июля 2010 г. 14:54
    • Отменено предложение в качестве ответа a.derkachev 20 июля 2010 г. 7:24
    • Помечено в качестве ответа a.derkachev 21 июля 2010 г. 5:59
    19 июля 2010 г. 14:54
    Модератор

Все ответы

  • >Проблема-же заключатеся в том что этот список выводится построчно разными переменными, а мне надо как-то загнать их в одну переменную,
    Не совсем верно сформулировано, вам просто надо вывести данные в виде объектов. Например один из способов выглядит так:

    foreach ($objResult in $colResults)
        {$objComputer = $objResult.Properties;
         $objComputer.name
         $result = [system.Net.Dns]::GetHostByName($objComputer.name)
         $result.AddressList | ForEach-Object {$_.IPAddressToString }
         $obj = new-object psobject -property @{
            Name = $ObjComputer.Name
            IPAddresses = $result.AddressList
         }
        }

    Еще варианты тут: http://xaegr.wordpress.com/2009/10/22/new-object/


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Предложено в качестве ответа Vasily GusevModerator 19 июля 2010 г. 14:54
    • Отменено предложение в качестве ответа a.derkachev 20 июля 2010 г. 7:24
    • Помечено в качестве ответа a.derkachev 21 июля 2010 г. 5:59
    19 июля 2010 г. 14:54
    Модератор
  • у меня так получилось:

    $Comps=@("localhost","My_comp_mame")
    $Comps|select @{N="CompName";E={$_}}|
        select CompName, @{N="IpAddresses";E={[system.Net.Dns]::GetHostByName($_.CompName).AddressList}}|
        Export-Csv  -NoTypeInformation  -Path C:\reports\report.txt


    blog: http://shss.wordpress.com/
    19 июля 2010 г. 15:06
  • Направление верное, но что-то я похоже делаю не то. Чтобы экспортировать не последнюю запись, а весь список я завел массив и сохранял в него значения:

         $res = @()
    foreach ($objResult in $colResults)
        {$objComputer = $objResult.Properties;
         $obj.Name = $objComputer.name
         $result = [system.Net.Dns]::GetHostByName($objComputer.name)
         $result.AddressList | ForEach-Object {$obj.IPAddress = $_.IPAddressToString }
         $res = $res + $obj
       }
    foreach-object {$res}
    export-csv -Path d:\temp\comp.csv -InputObject $res

    Если выводить $obj.Name то все выводится правильно, в массиве-же почему-то n раз повторяется последняя запись из списка. Кроме того $res выдает список в нужном виде:

    Name                                    IPAddress
    ----                                    ---------
    {ДЕНИС-ПК}                              192.168.7.15

    а вот экспорт почему-то выдает вот это:

    #TYPE System.Object[]
    "Count","Length","LongLength","Rank","SyncRoot","IsReadOnly","IsFixedSize","IsSynchronized"
    "28","28","28","1","System.Object[]","False","True","False"

    Что я делаю не так?

    20 июля 2010 г. 7:23
  • >я завел массив и сохранял в него значения ...Что я делаю не так?

    Василий уже писал выше, что на вход командлету export-csv необходимо подавать ОБЪЕКТЫ, а не набор переменных или массив переменных.

     help export-csv -full

    ОПИСАНИЕ
        Преобразует объекты Microsoft .NET Framework в набор строк переменной длины, содержащих разделенные запятыми значен
        ия (CSV), и сохраняет эти строки в CSV-файл.


    blog: http://shss.wordpress.com/
    20 июля 2010 г. 7:28
  • >я завел массив и сохранял в него значения ...Что я делаю не так?

    Василий уже писал выше, что на вход командлету export-csv необходимо подавать ОБЪЕКТЫ, а не набор переменных или массив переменных.

    Понятно, тогда мне нужен не экспорт в CSV а просто  > c:\filename.txt

    Тогда актуальным остается только вопрос - почему в массив попадает только последний элемент из списка?

    20 июля 2010 г. 9:21
  • То, что вы запостили в последний раз, вообще работать не будет, ибо сломается на следующей строке: $obj.Name = $objComputer.name

    что такое $obj?

    покажите тот скрипт, который вы запускали.


    blog: http://shss.wordpress.com/
    20 июля 2010 г. 9:27
  • cls
    # Зададим количество дней, прошедших с последнего логона
    $LastLogon = (get-date).AddDays(-5).ToFileTime()
    #
    #Определим LDAP-фильтр для запроса
    $Filter = "(&(objectcategory=computer)(|(lastLogonTimestamp<=$LastLogon)(!(lastLogonTimestamp=*))))"
    
    $objDomain = New-Object System.DirectoryServices.DirectoryEntry
    
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = $objDomain
    $objSearcher.Filter = ($Filter)
    
    $colProplist = "name"
    foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}
    
    $colResults = $objSearcher.FindAll()
    
      $obj = new-object psobject -property @{
      Name = $ObjComputer.Name
      IPAddress = $result.AddressList
      }
      $res = @()
    foreach ($objResult in $colResults)
     {$objComputer = $objResult.Properties;
      $obj.Name = $objComputer.name
      $result = [system.Net.Dns]::GetHostByName($objComputer.name)
      $result.AddressList | ForEach-Object {$obj.IPAddress = $_.IPAddressToString}
      $res = $res + $obj
     } 
    foreach-object {$res > d:\temp\comp.txt}
    20 июля 2010 г. 10:04
  • >foreach-object {$res > d:\temp\comp.txt}

    зачем здесь foreach-object? (мне не понятно)

     

    >$result.AddressList | ForEach-Object {$obj.IPAddress = $_.IPAddressToString}

    эта последовательность команд сохранит только последний IP-адрес в поле объекта.


    blog: http://shss.wordpress.com/
    20 июля 2010 г. 11:46
  • foreach видимо лишний, однако $res > d:\temp\comp.txt всеравно выводит список только послего компа.

    про IPAddressToString знаю, но в данном случае думаю такое допущение простительно.

    20 июля 2010 г. 12:46
  • покажите чему равно $res.count ?


    blog: http://shss.wordpress.com/
    20 июля 2010 г. 12:55
  • ame                                    IPAddress                             
    ----                                    ---------                             
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    {NATALYA_NB}                            192.168.1.232                         
    20 июля 2010 г. 13:29
  • это ответ на какой вопрос?


    blog: http://shss.wordpress.com/
    20 июля 2010 г. 13:41
  • покажите чему равно $res.count ?


    blog: http://shss.wordpress.com/

    команда $res > d:\temp\comp.txt выдает вышеприведенный список
    20 июля 2010 г. 13:53
  • замечательно.

    Давайте зададим себе вопрос: что нужно сделать, чтобы найти ошибку в скрипте?


    blog: http://shss.wordpress.com/
    20 июля 2010 г. 14:08
  • замечательно.

    Давайте зададим себе вопрос: что нужно сделать, чтобы найти ошибку в скрипте?


    blog: http://shss.wordpress.com/

    К чему были все эти вопросы? Понятное дело что в скрипте есть ошибка, я знаю в какой части она и просил помощи с тем чтобы ее выявить и исправить, с вами-же только время потерял на никому не нужные (как выяснилось уточнения). Нигде в описании PowerShell я не встречал упоминания о том что по операнду + в массив заносятся адреса переменных, а не их содержимое (а проблема была именно в этом). Вообщем если вы это знали, то что мешало сказать об этом прямо, ну а если не знали то зачем было мне голову морочить? Мой вам дизреспект.
    21 июля 2010 г. 5:59
  • >К чему были все эти вопросы?

    По основному вопросу ответ вам был дан в первых двух постах. Но вы его не услышали. Поэтому пришлось его повторять еще раз. Большое количество вопросов было порождено качеством ваших ответов. Голову вам никто не морочил, вас подталкивали к правильным действиям. Вы таки самостоятельно выполнили отладку, обнаружили и победили проблему. Поздравляю.

    PS "по операнду + в массив заносятся адреса переменных, а не их содержимое " - вывод не совсем правильный. Массивы, так же как оператор сложения, тут не при чем. IMHO, причиной является опреатор присваивания, выполняющий присвоение объекта psobject,  хэш-таблицы или массива по ссылке.

    PS > $a = new-object psobject -property @{
    >>         First = "1"
    >>         Second = "2"
    >> }
    >>
    PS > $a

    Second                                                      First
    ------                                                      -----
    2                                                           1


    PS > $b=$a
    PS > $b

    Second                                                      First
    ------                                                      -----
    2                                                           1


    PS > $a.First="1111111111"
    PS > $a

    Second                                                      First
    ------                                                      -----
    2                                                           1111111111


    PS > $b

    Second                                                      First
    ------                                                      -----
    2                                                           1111111111


    blog: http://shss.wordpress.com/
    21 июля 2010 г. 7:38