none
Удалить локальные не активные учетные записи со всех компьютеров в домене RRS feed

  • Вопрос

  • Добрый день!

    Подскажите, как автоматически удалить локальные не активные учетные записи со всех компьютеров в домене? ПК - более 350 шт. Операционные системы Windows XP и Windows 7. 

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

    10 апреля 2014 г. 6:14

Ответы

  • "Операция не предназначена для встроенных учетных записей." - Либо добавить эти учетные записи в переменную $exuser .Если эта учетная запись встроенного администратора,то исключить по sid:

    Foreach($computer in $computers) {
    	if(Test-Connection  -Count 2 -Quiet -ComputerName $computer)
    	{
    		$comp = [ADSI]"WinNT://$computer,computer"
    		if($comp.Path) {
    			$filter = {$_.SchemaClassName -eq "User" -and $exuser -notcontains $_.Name -and (!$_.properties["lastlogin"] -or $_.properties["lastlogin"] -lt (Get-Date).AddDays(-60))}
    			$comp.Children | Where $filter | Foreach {
    				$sid = New-Object System.Security.Principal.SecurityIdentifier($_.objectsid[0],0)
    				if($sid.Value -notmatch "500$"){
    					$comp.Delete("User",$_.Name[0])
    				}
    			}
    		}
    	}
    }


    • Изменено KazunEditor 10 апреля 2014 г. 16:40
    • Предложено в качестве ответа Vector BCOModerator 11 апреля 2014 г. 7:23
    • Помечено в качестве ответа KazunEditor 21 апреля 2014 г. 15:59
    10 апреля 2014 г. 16:40
    Отвечающий

Все ответы

  • Скрипт удаляет локальные учетные записи, которые последний раз регистрировались в системе более 60 дней или никогда. В $exuser - содержаться имена учетных записей, которые не требуется удалять(Администратор,Гость,UpdatusUser - создается с ПО от Nvidia).

    $exuser = "Администратор","Гость","Administrator","Guest"
    $computers = Get-ADComputer -Filter {Enabled -eq $true} | Foreach {$_.DNSHostName}
    
    Foreach($computer in $computers) {
    	if(Test-Connection  -Count 2 -Quiet -ComputerName $computer)
    	{
    		$comp = [ADSI]"WinNT://$computer,computer"
    		if($comp.Path) {
    			$filter = {$_.SchemaClassName -eq "User" -and $exuser -notcontains $_.Name -and (!$_.properties["lastlogin"] -or $_.properties["lastlogin"] -lt (Get-Date).AddDays(-60))}
    			$comp.Children | Where $filter | Foreach {
    				$comp.Delete("User",$_.Name)
    			}
    		}
    	}
    }

    10 апреля 2014 г. 7:07
    Отвечающий
  • Добрый день!

    Спасибо за помощь, но что-то скрипт выбивает ошибки. Подскажите, что не так?

    Исключение при вызове "Delete" с "2" аргументами: "Несовпадение типов. (Исключение из HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))"
    F:\123.ps1:12 знак:17
    +                 $comp.Delete <<<< ("User",$_.Name)
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

    Test-Connection : Не удается проверить аргумент для параметра "ComputerName". Аргумент пустой или имеет значение NULL. Укажите не пустой аргумент, не имеющий значение NULL, после чего п
    овторите выполнение команды.
    F:\123.ps1:6 знак:51
    +     if(Test-Connection  -Count 2 -Quiet -ComputerName <<<<  $computer)
        + CategoryInfo          : InvalidData: (:) [Test-Connection], ParameterBindingValidationException
        + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.TestConnectionCommand

    10 апреля 2014 г. 12:03
  • 1) Test-Connection

    Вероятней всего отсутствует свойство DNSHostName. Поэтому, лучше ограничить фильтр:

    $computers = Get-ADComputer -Filter {Enabled -eq $true -and DNSHostName -like '*'} | Foreach {$_.DNSHostName}

    2) Delete

    Не заметил, что не добавил [0].

    $comp.Delete("User",$_.Name[0])

    10 апреля 2014 г. 13:16
    Отвечающий
  • Извините, но опять не запускается и висит.

    Исключение при вызове "Delete" с "2" аргументами: "Операция не предназначена для встроенных учетных записей.

    :\123.ps1:12 знак:17
                     $comp.Delete <<<< ("User",$_.Name[0])
       + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
       + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
    10 апреля 2014 г. 14:17
  • "Операция не предназначена для встроенных учетных записей." - Либо добавить эти учетные записи в переменную $exuser .Если эта учетная запись встроенного администратора,то исключить по sid:

    Foreach($computer in $computers) {
    	if(Test-Connection  -Count 2 -Quiet -ComputerName $computer)
    	{
    		$comp = [ADSI]"WinNT://$computer,computer"
    		if($comp.Path) {
    			$filter = {$_.SchemaClassName -eq "User" -and $exuser -notcontains $_.Name -and (!$_.properties["lastlogin"] -or $_.properties["lastlogin"] -lt (Get-Date).AddDays(-60))}
    			$comp.Children | Where $filter | Foreach {
    				$sid = New-Object System.Security.Principal.SecurityIdentifier($_.objectsid[0],0)
    				if($sid.Value -notmatch "500$"){
    					$comp.Delete("User",$_.Name[0])
    				}
    			}
    		}
    	}
    }


    • Изменено KazunEditor 10 апреля 2014 г. 16:40
    • Предложено в качестве ответа Vector BCOModerator 11 апреля 2014 г. 7:23
    • Помечено в качестве ответа KazunEditor 21 апреля 2014 г. 15:59
    10 апреля 2014 г. 16:40
    Отвечающий
  • Добрый день!

    У меня не много не мало удалило все не активные в домене. Теперь восстанавливаю. Можно как-то увидеть, что делает скрипт.

    Я последний раз запускал его в такой конфигурации

    $exuser = "Администратор","Гость","Administrator","Guest"
    $computers = Get-ADComputer -Filter {Enabled -eq $true -and DNSHostName -like '*'} | Foreach {$_.DNSHostName}

    Foreach($computer in $computers) {
    if(Test-Connection  -Count 2 -Quiet -ComputerName $computer)
    {
    $comp = [ADSI]"WinNT://$computer,computer"
    if($comp.Path) {
    $filter = {$_.SchemaClassName -eq "User" -and $exuser -notcontains $_.Name -and (!$_.properties["lastlogin"] -or $_.properties["lastlogin"] -lt (Get-Date).AddDays(-60))}
    $comp.Children | Where $filter | Foreach {
    $comp.Delete("User",$_.Name[0])
    }
    }
    }
    }

    11 апреля 2014 г. 5:56
  • Увидеть уже ничего не получится, т.к. диагностических сообщений в скрипт не добавлено. Далее под фильтр подпадают и контроллеры домена(где локальных учетных записей - нет). Я не думал, что Вы не ограничите область до OU  с компьютерами, а не весь домен, используя параметр SearchBase "Ou=Comp,DC=Contoso,DC=Com".

    Предлагаю, ограничить фильтр поиска по Os Xp/7 и добавить OU с компьютерами. 

    $filter = {Enabled -eq $true -and DNSHostName -like '*' -and (OperatingSystem -like "Windows XP*" -or OperatingSystem -like "Windows 7*")}
    Get-ADComputer -filter $filter

    PS. И добавить минимальные диагностические данные.

    $comp.Children | Where $filter | Foreach {
    	$user = $_.Name[0]
    	try {
    		$comp.Delete("User",$user)
    		"Пользователь $user удален с компьютера $($comp.Name)" >> good.log
    	}
    	catch {
    		"Пользователя $user удалить не удалось с $($comp.Name)" >> bad.log
    	}
    }


    • Изменено KazunEditor 11 апреля 2014 г. 6:16
    11 апреля 2014 г. 6:12
    Отвечающий
  • вроде как скрипт зашел на контроллеры домена и удалил данные.
    11 апреля 2014 г. 6:13
  • вроде как скрипт зашел на контроллеры домена и удалил данные.
    Я и имел ввиду, что если скрипт зайдет на DC он будет удалять учетные записи домена, т.к. локальных нет.
    11 апреля 2014 г. 6:18
    Отвечающий
  • Спасибо. Буду пробовать. 
    11 апреля 2014 г. 6:34