Olá Pessoal,
Semana passada recebi uma pergunta a respeito do atributo badpwdcount do Active Ditectory usando Powershell. O objetivo era incrementar esse número afim de bloquear a conta de usuário para fins de teste. Por vias “comuns” não é possível alterar esse atributo como faríamos com outros:
Set-ADUser -Identity jdemo -Replace @{ badpwdcount = 10 }
Esse atributo só é incrementado pelo Domain Controller que o usuário está autenticando e não se replica para outros Domain Controllers, portanto precisaríamos simular uma autenticação do usuário com uma senha incorreta com o número de vezes que você deseja incrementar o valor do atributo.
Para simularmos essa autenticação precisamos da Classe System.DirectoryServices.AccountManagement.PrincipalContext, que contém o método ValidateCredentials. Nesse método devemos utilizar 2 argumentos, a SamAccountName do usuário e uma senha incorreta, ao executar esse método, o atributo badpasswd é incrementado, ou seja, precisamos executar esse método as X vezes desejadas em cada Domain Controller do domínio.
Isso pode ser alcançado com o código abaixo, que armazena na variável Domain as informações de cada Domain Controller do domínio, em seguida criamos um laço foreach para percorrer cada um dos Domain Controllers da lista e criamos um PrincipalContext informando o tipo de contexto e o nome do Domain Controller, a partir daí podemos invocar o método ValidateCredentials:
$Domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetComputerDomain() foreach($DomainController in $Domain.DomainControllers) { $Context = New-Object -TypeName System.DirectoryServices.AccountManagement.PrincipalContext -ArgumentList ([System.DirectoryServices.AccountManagement.ContextType]::Domain, $DomainController.Name) [void]$Context.ValidateCredentials('jdemo', 'ESTASENHAESTAINCORRETA') }
Para facilitar a execução, fiz uma função que encapsula isso de uma forma simplificada:
function Block-ADUserAccount { Param( [String]$Identity, [Int]$NumberOfAttempts ) Process{ $Domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetComputerDomain() foreach($DomainController in $Domain.DomainControllers) { $Context = New-Object -TypeName System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::Domain, $DomainController.Name) for($i=1; $i -le $NumberOfAttempts; $i++) { [void]$Context.ValidateCredentials($Identity, 'ESTASENHAESTAINCORRETA') } } } } Block-ADUserAccount -Identity jdemo
Lembre-se, não me responsabilizo por uso indevido do código, ele foi criado para fins de aprendizado apenas.
Dúvidas? Sugestões? Comente!
Até a próxima!