TL; DR
Concordo com a outra resposta de que o adaptador ADSI PowerShell funciona para isso. Também concordo com os comentários de que, se você quiser fornecer credenciais de forma interativa, deverá usar Get-Credential
e não Read-Host
.
Veja como eu fiz isso - eu acho que peguei esse script de algum site e estou envergonhado por não dar crédito porque eu não comentei ou fiquei sabendo de onde eu o recebi.
Preparação
Primeiro, meu script testa a conexão:
if((Test-Connection -ComputerName $Computer -count 1 -ErrorAction 0)) {
$Isonline = "ONLINE"
Write-Verbose "'t$Computer is Online"
} else { Write-Verbose "'t$Computer is OFFLINE" }
A alteração da senha
Em seguida, meu script usa try/catch
para tentar definir a senha e registrar e relatar sucesso ou falha:
try {
$account = [ADSI]("WinNT://$Computer/-PUT THE USERNAME YOU WANT TO CHANGE HERE-,user")
$account.psbase.invoke("setpassword",$password)
Write-Verbose "'tPassword Change completed successfully"
}
catch {
$status = "FAILED"
Write-Verbose "'tFailed to Change the administrator password. Error: $_"
}
Existem algumas diferenças aqui. Primeiro, eu sabia o nome de usuário da conta que queria alterar antecipadamente (meu script era alterar todas as senhas do administrador local de uma só vez). Você pode usar
$user = [adsi]"WinNT://$computer/$($credential.GetNetworkCredential().Username),user"
em vez disso, como mencionado na outra resposta. Além disso, meu script (que funcionou para mim em servidores 2012 R2) usa $user.psbase.invoke("setpassword",$password)
em vez de $user.SetPassword($password)
. Confesso que não sei qual é a diferença ou se um funcionará melhor que o outro.
Relatórios
Por fim, meu script informa sobre sucesso / falha. Isso porque eu usei meu script para percorrer todos os servidores no ambiente para atualizar todas as senhas de administrador local, então eu precisava saber quais servidores falharam, se houver, para que eu pudesse voltar manualmente e resolvê-los. Isso pode não ser necessário para você.
$obj = New-Object -TypeName PSObject -Property @{
ComputerName = $Computer
IsOnline = $Isonline
PasswordChangeStatus = $Status
}
$obj | Select ComputerName, IsOnline, PasswordChangeStatus
if($Status -eq "FAILED" -or $Isonline -eq "OFFLINE") {
$stream.writeline("$Computer 't $isonline 't $status")
}