none
PowerShell: массовая деактивация пользователей Active Directory RRS feed

  • Вопрос

  • Я заранее извиняюсь за такой наглый вопрос, но сроки горят, голова пухнет, не успеваю.

    Задача:

    Есть список пользователей в экселе, нужно деактивировать их и перенести в определенную группу.

    Достал список фамилий, сохранил в txt, проблемы с кодировкой, плюс оказалась обязательной работа с excel, вы мне не поможете дописать скрипт?

    Param(
     [string]$InputFile = "c:\users.txt",
     [string]$OutputFile = "c:\disabledusers.txt"
     )
     
    $Result = @()
    $DisabledCount = 0
    $AlreadyDisabledCount = 0
    $NotFoundCount = 0
     
    Get-Content $InputFile | ForEach-Object {
     $User = $null
     $User = Get-ADUser -f {surname -eq "$_"}
     If ($User)
     { If ($User.Enabled)
     { $User | Set-ADUser -Enabled $false
     $Result += New-Object PSObject -Property @{
     User = $User.Name
     DN = $User.distinguishedName
     Status = "Disabled"
     }
     $DisabledCount ++
     }
     Else
     { $Result += New-Object PSObject -Property @{
     User = $User.Name
     DN = $User.distinguishedName
     Status = "Already disabled"
     }
     $AlreadyDisabledCount ++
     }
     }
     Else
     { $Result += New-Object PSObject -Property @{
     User = $_
     DN = "N/A"
     Status = "User not found"
     }
     $NotFoundCount ++
     }
    }
    $Result = $Result | Select User,Status,DN
    $Result | Out-GridView
    $Result | Export-CSV $OutputFile -encoding ASCI -NoTypeInformation
    cls
    Write-Host "Accounts in file: $((Get-Content $InputFile).Count)"
    Write-Host "Users Disabled: $DisabledCount"
    Write-Host "Users Already Disabled: $AlreadyDisabledCount"
    Write-Host "Users Not Found: $NotFoundCount"

    И на будущее как правильно с кодировками работать, пробовал все связки все равно не работает.


    • Изменено ice-study 15 апреля 2013 г. 8:57
    15 апреля 2013 г. 8:56

Ответы

  • Конкретно для данного формата файла:

    $Result = @()
    $DisabledCount = 0
    $AlreadyDisabledCount = 0
    $NotFoundCount = 0
    
    $ou = "OU=Disabled_Users,DC=Contoso,DC=Com"
    
    $ex = New-Object -ComObject Excel.Application
    $wb = $ex.Workbooks.Open("C:\files\тест.xls")
    $ws = $wb.Worksheets.Item("Sheet1")
    
    $intRow = 4
    Do {
    	$name = $ws.Cells.Item($intRow, 2).Value()
    	$sn = $name.Split(" ")[0]
    	if($sn) {
    		$User = Get-ADUser -f {surname -eq $sn}
    		if($User) {
    			If ($User.Enabled) {
    				$User | Set-ADUser -Enabled $false
    				$Status = "Disabled"
    				$DisabledCount++
    			}
    			else {
    				$Status = "Already disabled"
    				$AlreadyDisabledCount++
    			}
    			$Result += New-Object PSObject -Property @{
    				User = $User.Name
    				DN = $User.distinguishedName
    				Status = $Status
    			}
    		}
    		else {
    			$Result += New-Object PSObject -Property @{
    				User = $name
    				DN = "N/A"
    				Status = "User not found"
    			}
    			$NotFoundCount++
    		}
    	}
    	$intRow++
    } While ($ws.Cells.Item($intRow,1).Value())
    
    $Result | Where {$_.DN -ne "N/A"} | Foreach {Move-ADObject -Identity $_.DN -TargetPath $ou}
    
    $wb.Close($false)
    $ex.Quit()
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex)
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb)
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws)
    
    cls
    Write-Host "Accounts in file: $($Result.Count)"
    Write-Host "Users Disabled: $DisabledCount"
    Write-Host "Users Already Disabled: $AlreadyDisabledCount"
    Write-Host "Users Not Found: $NotFoundCount"


    • Изменено KazunEditor 15 апреля 2013 г. 10:05
    • Помечено в качестве ответа KazunEditor 16 апреля 2013 г. 10:34
    15 апреля 2013 г. 10:04
    Отвечающий

Все ответы

  • 1) Приложить пример файла excel

    2) Кодировка желательно UTF-8

    3) Именно в группу,а не в OU? 
    • Изменено KazunEditor 15 апреля 2013 г. 9:04
    15 апреля 2013 г. 9:04
    Отвечающий
  • Kazun, благодарю вас за помощь, еще раз извиняюсь просто ситуация очень критичная. 

    1) Не нашел как тут залить файлы: http://webfile.ru/6478707 (поле действительно sN, такая особенность базы)

    2) Вроде ставлю в UTF-8 на выходе получаю знаки вопроса вместо имен.

    3) Да, действительно OU, впопыхах написал неверно.


    15 апреля 2013 г. 9:16
  • Конкретно для данного формата файла:

    $Result = @()
    $DisabledCount = 0
    $AlreadyDisabledCount = 0
    $NotFoundCount = 0
    
    $ou = "OU=Disabled_Users,DC=Contoso,DC=Com"
    
    $ex = New-Object -ComObject Excel.Application
    $wb = $ex.Workbooks.Open("C:\files\тест.xls")
    $ws = $wb.Worksheets.Item("Sheet1")
    
    $intRow = 4
    Do {
    	$name = $ws.Cells.Item($intRow, 2).Value()
    	$sn = $name.Split(" ")[0]
    	if($sn) {
    		$User = Get-ADUser -f {surname -eq $sn}
    		if($User) {
    			If ($User.Enabled) {
    				$User | Set-ADUser -Enabled $false
    				$Status = "Disabled"
    				$DisabledCount++
    			}
    			else {
    				$Status = "Already disabled"
    				$AlreadyDisabledCount++
    			}
    			$Result += New-Object PSObject -Property @{
    				User = $User.Name
    				DN = $User.distinguishedName
    				Status = $Status
    			}
    		}
    		else {
    			$Result += New-Object PSObject -Property @{
    				User = $name
    				DN = "N/A"
    				Status = "User not found"
    			}
    			$NotFoundCount++
    		}
    	}
    	$intRow++
    } While ($ws.Cells.Item($intRow,1).Value())
    
    $Result | Where {$_.DN -ne "N/A"} | Foreach {Move-ADObject -Identity $_.DN -TargetPath $ou}
    
    $wb.Close($false)
    $ex.Quit()
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex)
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb)
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws)
    
    cls
    Write-Host "Accounts in file: $($Result.Count)"
    Write-Host "Users Disabled: $DisabledCount"
    Write-Host "Users Already Disabled: $AlreadyDisabledCount"
    Write-Host "Users Not Found: $NotFoundCount"


    • Изменено KazunEditor 15 апреля 2013 г. 10:05
    • Помечено в качестве ответа KazunEditor 16 апреля 2013 г. 10:34
    15 апреля 2013 г. 10:04
    Отвечающий
  • Благодарю вас.

    Отходя от темы: У меня так вышло что в поле sN стоит фио пользователя полностью, поэтому я чуть чуть подредактировал скрипт. А если бы все было канонически, как бороться с однофамильцами?

    15 апреля 2013 г. 13:16
  • Благодарю вас.

    Отходя от темы: У меня так вышло что в поле sN стоит фио пользователя полностью, поэтому я чуть чуть подредактировал скрипт. А если бы все было канонически, как бороться с однофамильцами?


    У пользователя есть атрибут, где есть ФИО? Или как вариант использовать samaccountname.
    15 апреля 2013 г. 13:35
    Отвечающий
  • Благодарю. 
    Скрипт отлично отработал, я только добавил вывод результата 

    $Result = $Result | Select User,Status,DN
    $Result | Out-GridView
    $Result | Export-CSV $OutputFile -encoding ASCI -NoTypeInformation

    И чтобы можно было понять какие пользователи не найдены:

    Поменял на:

    			$Result += New-Object PSObject -Property @{
    				User = $name
    				DN = $sn				
    				Status = "User not found"

    16 апреля 2013 г. 6:04