Estou tentando criar um script para redefinir a senha do administrador local de um computador remoto na minha organização. Sou muito novo no PowerShell e estou aprendendo a maior parte tentando e falhando no processo. O script que tenho até agora:
Import-Module ActiveDirectory
$computer = Read-Host -Prompt "Enter computer Name Here"
$password = Read-Host -Prompt "Enter Password Here"
Set-ADAccountPassword - Identity $computer -NewPassword $password
Provavelmente é apenas um erro estúpido, então, por favor, seja gentil comigo :)
Responder1
DR
Concordo com a outra resposta de que oAdaptador ADSI do PowerShellfunciona para isso. Também concordo com os comentários de que se você deseja fornecer credenciais de forma interativa, você deve usar Get-Credential
e não Read-Host
.
Veja como eu fiz isso - acho que peguei esse script de algum site e estou envergonhado por não poder dar crédito porque não comentei ou não acompanhei de onde o obtive.
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 mudança de senha
Em seguida, meu script try/catch
tenta 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 antecipadamente o nome de usuário da conta que queria alterar (meu script era alterar todas as senhas de administrador local de uma vez). Você pode usar
$user = [adsi]"WinNT://$computer/$($credential.GetNetworkCredential().Username),user"
em vez disso, conforme mencionado na outra resposta. Além disso, meu script (que funcionou para mim em servidores R2 de 2012) 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.
Comunicando
Finalmente, meu script relata sucesso/fracasso. Isso ocorre porque usei meu script para percorrer todos os servidores no ambiente para atualizar todas as senhas de administrador local, então precisava saber quais servidores falharam, se houver, para que 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")
}
Responder2
Se você tiver o Powershell 5.0 ou anterior, precisará usar o adaptador Powershell ADSI para manipular uma conta de usuário local em um computador remoto:
$computer = Read-Host -Prompt "Enter Computer Name Here";
$credential = Get-Credential -UserName "Administrator" -Message "Enter new password";
$user = [adsi]"WinNT://$computer/$($credential.GetNetworkCredential().Username),user";
$user.SetPassword($credential.GetNetworkCredential().Password);
$user.SetInfo();
Você pode querer verificar se é possível executar ping no computador remoto antes de realmente tentar se conectar a ele e resolver esse caso quando o usuário clicar em Cancelar na caixa de diálogo de entrada de credenciais.
$computer = Read-Host -Prompt "Enter Computer Name Here";
If (Test-Connection -ComputerName $computer -Count 2 -Quiet) {
Write-Host "The computer responded to our ping request. Connecting...";
$credential = Get-Credential -UserName "Administrator" -Message "Enter new password";
If ($credential -eq $null) {
Write-Warning "The username and/or the password is empty! I quit.";
Exit;
}
$user = [adsi]"WinNT://$computer/$($credential.GetNetworkCredential().Username),user";
$user.SetPassword($credential.GetNetworkCredential().Password);
$user.SetInfo();
} Else {
Write-Warning "The computer does not respond to our ping request. I quit.";
}
Editar:No Windows 10 build 1607, o novo Powershell 5.1 introduziu o Set-LocalUser
comando. Você pode usá-lo para esta tarefa em vez do adaptador ADSI, mas requer que o serviço de comunicação remota Powershell esteja habilitado (que está desabilitado por padrão) nos computadores remotos. Para permitir a aceitação de comandos remotos, você precisa executar Enable-PSRemoting
em um terminal Powershell elevado no computador remoto.
Se a comunicação remota PS estiver habilitada, um script modificado ficará assim:
$computer = Read-Host -Prompt "Enter Computer Name Here";
If (Test-Connection -ComputerName $computer -Count 2 -Quiet) {
Write-Host "The computer responded to our ping request. Connecting...";
Invoke-Command -ComputerName $computer -ScriptBlock {
$credential = Get-Credential -UserName "Administrator" -Message "Enter new password";
If ($credential -eq $null) {
Write-Warning "The username and/or the password is empty! I quit.";
Exit;
}
Set-LocalUser -Name $credential.UserName -Password $credential.Password;
}
} Else {
Write-Warning "The computer does not respond to our ping request. I quit.";
}