none
Скрипт для записи в атрибут Description объекта-компьютера в AD имени текущего «залогоненного» пользователя RRS feed

  • Вопрос

  • Option Explicit
    Dim rootDSE,strDomainDN,objConnection
    Dim strSubContainer,objCommand,objRecordSet
    Dim strMsg, arrDescription, strAccountProp, objComputer, strLoggedOnUser
    'определяем константы
    'символ-разделитель, используемый для формирования строки отчета
    Const SPLITER = ","
    'констатны, определяющие глубину поиска
    Const ADS_SCOPE_SUBTREE = 2
    Const ADS_SCOPE_ONELEVEL = 1
    'константа, выделяющая бит Enable|Disable из мультибитового атрибута userAccountControl
    Const ADS_UF_ACCOUNTDISABLE = 2
    'зададим контейнер AD, начиная с которого будем осуществлять поиск
    strSubContainer="OU=WS_RO,OU=WS,"
    'получим DN домена
    Set rootDSE = GetObject("LDAP://rootDSE")
    strDomainDN = rootDSE.Get("defaultNamingContext")
    'Выполняем подготовку обращения к AD при помощи ADODB
    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand =   CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"
    Set objCommand.ActiveConnection = objConnection
    'формируем SELECT-запрос к AD
    objCommand.CommandText = "Select Name, " &_
            "operatingSystem, operatingSystemServicePack, Description, userAccountControl, distinguishedName " &_
            "from 'LDAP://"&strSubContainer&strDomainDN&"' " &_
            "Where objectClass='computer'"
    'определим максимальное количество объектов, возвращаемых в результирующем наборе записей
    objCommand.Properties("Page Size") = 1000
    'будем производить поиск по всему поддереву, начиная с заданного каталога
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 'ADS_SCOPE_ONELEVEL 'ADS_SCOPE_SUBTREE
    'выполняем сформированный запрос, результатом которого является набор записей objRecordSet
    Set objRecordSet = objCommand.Execute
    If objRecordSet.RecordCount<1 Then
        WScript.Echo "No computer accounts found in "&strContainer&strDomainDN
        WScript.Quit
    End If
    objRecordSet.MoveFirst
    Do Until objRecordSet.EOF
        ''Выбираем только компьютеры, у которых Account установлен в Enabled
        ''If ((InStr(objRecordSet.Fields("operatingSystem"),"XP")>0) And (InStr(objRecordSet.Fields("operatingSystemServicePack"),"2")>0)) Then
        If (objRecordSet.Fields("userAccountControl").Value And ADS_UF_ACCOUNTDISABLE)=0 Then
            'формируем строку отчета
            strMsg = objRecordSet.Fields("Name").Value & _
            SPLITER & objRecordSet.Fields("operatingSystem").Value & _
            SPLITER & strAccountProp
            arrDescription = objRecordSet.Fields("Description").Value
            If Not IsNull (arrDescription) Then
                strMsg = strMsg & SPLITER & arrDescription(0)
            End If
            WScript.Echo strMsg
            'Вызываем функцию, возвращающую имя залогоненного пользователя на компьютере,
            'имя компьютера передается в функцию в качестве параметра
            strLoggedOnUser = fnGetUserName (objRecordSet.Fields("Name").Value)
            WScript.Echo "LoggedonUser :" & strLoggedOnUser
            'если имя залогонненого пользователя не пусто...
            If (Not IsEmpty(strLoggedOnUser)) And (Not IsNull (strLoggedOnUser)) Then
                '...записываем его в атрибут Description
                Set objComputer = GetObject("LDAP://"&objRecordSet.Fields("distinguishedName").Value)
                objComputer.Put "Description" , strLoggedOnUser
                objComputer.SetInfo
            End If
        End If
        objRecordSet.MoveNext
    Loop
    '
    'Эта функция опрашивает компьютер, чье имя передано ей в качестве параметра и
    'возвращает имя залогоненного на опрашиваемом компьютере пользователя
    Function fnGetUserName (strComputer)
    On Error Resume Next
    Dim objWMIService, colItems, objItem
    Const wbemFlagReturnImmediately = &h10
    Const wbemFlagForwardOnly = &h20

       Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
       Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem", "WQL", _
                                              wbemFlagReturnImmediately + wbemFlagForwardOnly)

       For Each objItem In colItems
          fnGetUserName = objItem.UserName
       Next
    On Error GoTo 0
    End Function

    Парни помогите со скриптом, нашел его http://shss.wordpress.com/2010/01/21/set-logged-on-user-name-as-value-of-description-attribute-of-computer-object-in-ad/, он работает нормально, опрашивает компы, только на каждом компе надо ок нажимать, а у меня их около 3000 компов, не серьезно, подскажите как это отключить и в конце опроса выскочило бы сообщение об опросе, такое возможно?

    29 декабря 2010 г. 3:33

Ответы

  • >Cmdlet Get-QADComputer по умолчанию нет,для этого надо установить http://www.quest.com/powershell/activeroles-server.aspx

    Еще добавлю 5 копеек: надо не только установить эту оснастку, но и подключить ее. Мой скрипт эту оснастку не подключает, т.к. я предпочитаю подключать все зарегистрированные оснастки и модули при помощи профиля PowerShell. Посему вам надо будет добавть строку с подключением оснастки либо в скрипт, либо в профиль.


    blog: http://shss.wordpress.com/
    30 декабря 2010 г. 11:28
  • >он работает нормально, опрашивает компы, только на каждом компе надо ок нажимать

    чего-то я не припоминаю такого функционала в этом моем скрипте ;)

    ЗЫ А дошло! ;) Вы его просто двойным щелчком запустили, да? Если так, то скрипт стартует при помощи хоста WScript, в результате каждоее сообщение, которое выводит скрипт при помощи WScript.Echo, отображается в отдельном модальном окне.

    Все, что вам нужно было сделать, - это правильно запустить скрипт. Т.е. запустить его при помощи хоста cscript:

    c:\> cscript имя_скрипта.vbs


    blog: http://shss.wordpress.com/
    30 декабря 2010 г. 11:23

Все ответы

  • ####################################################
    #
    SetSompDesc.ps1 20090112 ShS
    #
    #
    Записываем в атрибут Description каждого объекта Computer, имя, залогоненого на нем пользователя
    #
    ###################################################
    cls
    #Функция возращает true, если заданный хост пингуется и false  - в противном случае (спасибо Xaerg'у)
    function Test-Host ($Name)
    {
       
    $ping = new-object System.Net.NetworkInformation.Ping
       
    trap {Write-Verbose "Ошибка пинга"; $False; continue}
       
    if ($ping.send($Name).Status -eq "Success" ) { $True }
       
    else { $False }
    }
    #Filter Where-Online
    #
    {
    #
        $ping = new-object System.Net.NetworkInformation.Ping
    #
        trap {Write-Verbose "Ошибка пинга"; Continue}
    #
        if ($ping.send($_).Status -eq "Success" ) { $_ }
    #
    }
    #
    #
    Зададим корневое OU, с которого будет начат поиск компьютеров
    $SearchRoot="dom.local/ORG/Workstations"
    #

    $Comps = Get-QADComputer -ErrorAction SilentlyContinue -SearchRoot $SearchRoot -SizeLimit 0 #|Select-Object -property "Name","Description"
    foreach ($Comp in $Comps)
    {
     
    if (Test-Host $Comp.Name)
         {
       
    $LoggedonUserName = (gwmi Win32_ComputerSystem -ErrorAction SilentlyContinue -ComputerName $Comp.Name).UserName
       
    Write-Host "CompName=",$Comp.Name, "  CompDescription=", $Comp.Description, "  LoggedonUser=", $LoggedonUserName
       
    if (($Comp.Description -ne $LoggedonUserName) -and ($LoggedonUserName -ne $null))
            {
           
    Write-Host "`nОтсутствует (или устаревшее) описание компа!`nМеняем на новое...`n`n"
           
    Set-QADObject $Comp.DN -Description $LoggedonUserName | Out-Null
            }
         }
    }

    Еще один скрипт нашел - http://shss.wordpress.com/2010/01/31/v2-set-logged-on-user-name-as-value-of-description-attribute-of-computer-object-in-ad/, он так же добавляет описание в компьютер, но только он у меня не работает

    пишет:

    Имя "Get-QADComputer" не распознано как имя командлета, функции, файла скрипта или выполняемой программы. П
    роверьте правильность написания имени, а также наличие и правильность пути, после чего повторите попытку.
    строка:26 знак:26
    +  $Comps = Get-QADComputer <<<<  -ErrorAction SilentlyContinue -SearchRoot $SearchRoot -SizeLimit 0 #|Sele
    ct-Object -property "Name","Description"
        + CategoryInfo          : ObjectNotFound: (Get-QADComputer:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException

    подскажите в чем проблема?

    29 декабря 2010 г. 3:52
  • Имя "Get-QADComputer" не распознано как имя командлета, функции, файла скрипта или выполняемой программы. П

    роверьте правильность написания имени, а также наличие и правильность пути, после чего повторите попытку.
    строка:26 знак:26
    +  $Comps = Get-QADComputer <<<<  -ErrorAction SilentlyContinue -SearchRoot $SearchRoot -SizeLimit 0 #|Sele
    ct-Object -property "Name","Description"
        + CategoryInfo          : ObjectNotFound: (Get-QADComputer:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException

    подскажите в чем проблема?

    Cmdlet Get-QADComputer по умолчанию нет,для этого надо установить http://www.quest.com/powershell/activeroles-server.aspx
    • Предложено в качестве ответа Vasily GusevModerator 31 декабря 2010 г. 6:15
    29 декабря 2010 г. 6:16
    Отвечающий
  • Вот статья знаменитого Scripting Guy:

    http://blogs.technet.com/b/heyscriptingguy/archive/2005/12/07/how-can-i-change-the-description-for-a-computer.aspx


    Решаю проблемы...
    29 декабря 2010 г. 16:11
  • Вот статья знаменитого Scripting Guy:

    http://blogs.technet.com/b/heyscriptingguy/archive/2005/12/07/how-can-i-change-the-description-for-a-computer.aspx


    Решаю проблемы...
    Перечитайте вопрос и этот скрипт тут из другой оперы.
    29 декабря 2010 г. 16:16
    Отвечающий
  • >он работает нормально, опрашивает компы, только на каждом компе надо ок нажимать

    чего-то я не припоминаю такого функционала в этом моем скрипте ;)

    ЗЫ А дошло! ;) Вы его просто двойным щелчком запустили, да? Если так, то скрипт стартует при помощи хоста WScript, в результате каждоее сообщение, которое выводит скрипт при помощи WScript.Echo, отображается в отдельном модальном окне.

    Все, что вам нужно было сделать, - это правильно запустить скрипт. Т.е. запустить его при помощи хоста cscript:

    c:\> cscript имя_скрипта.vbs


    blog: http://shss.wordpress.com/
    30 декабря 2010 г. 11:23
  • >Cmdlet Get-QADComputer по умолчанию нет,для этого надо установить http://www.quest.com/powershell/activeroles-server.aspx

    Еще добавлю 5 копеек: надо не только установить эту оснастку, но и подключить ее. Мой скрипт эту оснастку не подключает, т.к. я предпочитаю подключать все зарегистрированные оснастки и модули при помощи профиля PowerShell. Посему вам надо будет добавть строку с подключением оснастки либо в скрипт, либо в профиль.


    blog: http://shss.wordpress.com/
    30 декабря 2010 г. 11:28
  • Проблема такая, пробовал Ваш скрипт на vbs и на PoSh, скрипт отрабатывает без ошибок но выдает следующее:

    CompName= XP   CompDescription=    LoggedonUser=

    и т.д.

    Соответственно ничего не меняет в описании, запускал из под админдомена, в чем может быть проблема?

    2 февраля 2011 г. 5:00
  • >Соответственно ничего не меняет в описании, запускал из под админдомена, в чем может быть проблема?

    ЕМНИП, если LoggedonUser принимает значение пусто, то скрипт не меняет описание компьютера (что логично). Принимать же значение пусто он может, если на опрашиваемом компьютере никто не залогонен, либо произошла ошибка опроса, или, если пользователь, в контексте которого работает скрипт, не обладает правами локадмина на опрашиваемом компьютере.

    Удалите (временно) из скрипта обработчики ошибок: замените в строке

    $LoggedonUserName = (gwmi Win32_ComputerSystem -ErrorAction SilentlyContinue -ComputerName $Comp.Name).UserName

    SilentlyContinue на Stop

    Если будет возникать ошибка - запостите ее сюда.


    my blog: http://shserg.ru/

    2 февраля 2011 г. 6:25