none
Скрипт удаления объектов из контейнера RRS feed

  • Вопрос

  • Добрый день. Для наведения порядка в домене потребовался скрипт, который будет удалять объекты контейнера, хранящиеся в нем более 30 дней. Например компьютеры, находящиеся в OU Disabled Computers более 30 дней.

    Заранее спасибо!

    10 октября 2011 г. 9:13

Ответы

  • Попробуйте заменить:

     

    $ou.Delete("computer","cn="+$computer.cn)

    на

     

     

    $computer.DeleteTree()

     

    Или воспользоваться dsrm:

     

    dsrm $computer.distinguishedName -subtree

    • Изменено KazunEditor 17 октября 2011 г. 10:25
    • Помечено в качестве ответа ska84 17 октября 2011 г. 10:37
    17 октября 2011 г. 10:25
    Отвечающий
  • Спасибо!!! Помогло, все заработало. Конечный вариант скрипта:

    $ldate = (Get-Date).AddDays(-30)
    $ou = [ADSI]"LDAP://OU=Disabled Computers,OU=IT,DC=local,DC=ru"
    $computers = $ou | Foreach {$_.children | Where {$_.SchemaClassName -eq 'computer'}}
    foreach($computer in $computers)
    {
        if($computer.whenChanged -lt $ldate)
        {
            $computer.DeleteTree()
        }
    }


    17 октября 2011 г. 10:39

Все ответы

  • 1) oldcmp - http://www.joeware.net/freetools/tools/oldcmp/usage.htm

    2) dsquery computer "OU=Computers,OU=IT,DC=local,DC=ru" -inactive 4 | dsrm

    10 октября 2011 г. 9:36
    Отвечающий
  • dsquery computer "OU=Computers,OU=IT,DC=local,DC=ru" -inactive 4 | dsrm - что-то не удаляет
    10 октября 2011 г. 10:55
  • на что ругается?

    или просто ничего не выполняет? а если задать

    dsquery computer "OU=Computers,OU=IT,DC=local,DC=ru" -inactive 4

    то вылезает список?

    ---

    Кстати, вам нужен скрипт который удаляет обьекты которые лежат в определеннном контейнере какое то определенное время???

    или просто грохнуть все компы что неактивны в течении месяца и лежат в какойто оушке?

    • Изменено Svolotch 10 октября 2011 г. 11:15
    10 октября 2011 г. 11:10
  • Не ругается, выводит название компов и все. Они остаются в контейнере. Нужен скрипт, кот. удаляет определенные компы, лежащие в определенном контейнере какое-то определенное время.

    10 октября 2011 г. 11:49
  • dsquery computer "OU=Computers,OU=IT,DC=local,DC=ru" -inactive 4 | dsrm - не отработает для PowerShell,если используете PowerShell,то :

    dsquery computer "OU=Computers,OU=IT,DC=local,DC=ru" -inactive 4 | %{dsrm $_ -noprompt}
    


    10 октября 2011 г. 12:00
    Отвечающий
  • dsquery computer "OU=Computers,OU=IT,DC=local,DC=ru" -inactive 4 | dsrm - не отработает для PowerShell,если используете PowerShell,то :

     

    dsquery computer "OU=Computers,OU=IT,DC=local,DC=ru" -inactive 4 | %{dsrm $_ -noprompt}
    


     

    Слегка не то. Нужен скриптт, кот. удаляет компы, лежащие в определенном контейнере какое-то определенное время.
    10 октября 2011 г. 12:22
  • Отчасти решает задачу.Суть в том,что смотрим атрибут whenChanged(скажем при переносе в другую OU,отключение записи) ,данный атрибут меняется и сравниваем ,когда было последнее изменение.Если есть ведете,журнал изменения,то можно из него получить информацию.

    $ldate = (Get-Date).AddDays(-30)
    $ou = [ADSI]"LDAP://cn=Disabled Computers,dc=local,dc=ru" 
    $computers = $ou | Foreach {$_.children | Where {$_.SchemaClassName -eq 'computer'}}
    foreach($computer in $computers)
    {
    	if($computer.whenChanged -lt $ldate)
    	{
    		$ou.Delete("computer","cn="+$computers.cn)
    	}
    }
    


    • Предложено в качестве ответа Dmitry DavydovModerator 14 октября 2011 г. 14:14
    • Отменено предложение в качестве ответа Dmitry DavydovModerator 26 октября 2011 г. 9:36
    10 октября 2011 г. 13:07
    Отвечающий
  • Мужики туплю. Как его запустить? Какое расширение у файла должно быть. Спасибо.
    10 октября 2011 г. 13:27
  • По умолчанию - ps1 ,для запуска используйте полный путь (C:\scripts\script.ps1).
    10 октября 2011 г. 13:30
    Отвечающий
  • Спасибо.
    10 октября 2011 г. 13:34
  • Не работает. Пишет:

    Не удается загрузить файл D:\xxx.ps1, так как выполнение скриптов запрещено для данной системы. Введите "get-help about
    _signing" для получения дополнительных сведений.
    строка:1 знак:11
    + d:\xxx.ps1 <<<<
        + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
        + FullyQualifiedErrorId : RuntimeException

    Система - Windows 7

    12 октября 2011 г. 5:09
  • Не работает. Пишет:

    Не удается загрузить файл D:\xxx.ps1, так как выполнение скриптов запрещено для данной системы. Введите "get-help about
    _signing" для получения дополнительных сведений.
    строка:1 знак:11
    + d:\xxx.ps1 <<<<
        + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
        + FullyQualifiedErrorId : RuntimeException

    Система - Windows 7

    Выполнить:

    Set-ExecutionPolicy RemoteSigned
    

    • Предложено в качестве ответа Dmitry DavydovModerator 14 октября 2011 г. 14:14
    • Отменено предложение в качестве ответа Dmitry DavydovModerator 26 октября 2011 г. 9:35
    12 октября 2011 г. 8:43
    Отвечающий
  • Не работает. Пишет:

    При получении элемента "Delete" произошло следующее исключение: "Неопознанная ошибка
    "
    D:\xxx.ps1:8 знак:21
    +           $ou.Delete <<<< ("computer","ou="+$computers.cn)
        + CategoryInfo          : NotSpecified: (:) [], ExtendedTypeSystemException
        + FullyQualifiedErrorId : CatchFromBaseGetMember

    17 октября 2011 г. 7:12
  • Не работает. Пишет:

    При получении элемента "Delete" произошло следующее исключение: "Неопознанная ошибка
    "
    D:\xxx.ps1:8 знак:21
    +           $ou.Delete <<<< ("computer","ou="+$computers.cn)
        + CategoryInfo          : NotSpecified: (:) [], ExtendedTypeSystemException
        + FullyQualifiedErrorId : CatchFromBaseGetMember

    Я допустил ошибку($computers.cn ,правильный вариант $computer.cn).

    $ldate = (Get-Date).AddDays(-30)
    $ou = [ADSI]"LDAP://cn=Disabled Computers,dc=local,dc=ru" 
    $computers = $ou | Foreach {$_.children | Where {$_.SchemaClassName -eq 'computer'}}
    foreach($computer in $computers)
    {
    	if($computer.whenChanged -lt $ldate)
    	{
    		$ou.Delete("computer","cn="+$computer.cn)
    	}
    }
    


     


    • Изменено KazunEditor 17 октября 2011 г. 8:36
    17 октября 2011 г. 8:35
    Отвечающий
  • Скрипт отработал. Удалил учетки, но вывел несколько ошибок:

    Исключение при вызове "Delete" с "2" аргументами: "Служба каталогов может выполнять эту операцию только на оконечном ли
    стовом объекте.
    "
    D:\xxx.ps1:8 знак:13
    +         $ou.Delete <<<< ("computer","cn="+$computer.cn)
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

    17 октября 2011 г. 8:47
  • Попробуйте заменить:

     

    $ou.Delete("computer","cn="+$computer.cn)

    на

     

     

    $computer.DeleteTree()

     

    Или воспользоваться dsrm:

     

    dsrm $computer.distinguishedName -subtree

    • Изменено KazunEditor 17 октября 2011 г. 10:25
    • Помечено в качестве ответа ska84 17 октября 2011 г. 10:37
    17 октября 2011 г. 10:25
    Отвечающий
  • Спасибо!!! Помогло, все заработало. Конечный вариант скрипта:

    $ldate = (Get-Date).AddDays(-30)
    $ou = [ADSI]"LDAP://OU=Disabled Computers,OU=IT,DC=local,DC=ru"
    $computers = $ou | Foreach {$_.children | Where {$_.SchemaClassName -eq 'computer'}}
    foreach($computer in $computers)
    {
        if($computer.whenChanged -lt $ldate)
        {
            $computer.DeleteTree()
        }
    }


    17 октября 2011 г. 10:39
  • Когда-то курил подобную тему: http://social.technet.microsoft.com/Forums/ru-RU/scrlangru/thread/303cd413-e631-42ca-a340-29f9b3977c8e

    Советую быть осторожным с удалением компов


    Andy Mishechkin
    6 ноября 2011 г. 16:31