Redefinindo a senha do administrador local para um computador remoto usando o Powershell

1

Estou tentando criar um script para redefinir a senha do administrador local de um computador remoto na minha organização. Eu sou muito novo no powershell, e estou aprendendo a maior parte disso tentando e preenchendo o processo. O roteiro 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

O mais provável é que seja apenas um erro estúpido, então, por favor, seja gentil comigo:)

    
por Alon Shor 04.09.2018 / 13:20

2 respostas

1

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")
}
    
por 06.09.2018 / 16:00
0

Se você tiver o Powershell 5.0 ou anterior, precisará usar o adaptador ADSI da Powershell 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 lidar com 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 comando Set-LocalUser . Você pode usá-lo para essa tarefa em vez do adaptador ADSI, mas ele requer que o serviço de comunicação remota do Powershell esteja habilitado (que é desabilitado por padrão) nos computadores remotos. Para permitir aceitar comandos remotos, você precisa executar o Enable-PSRemoting em um terminal Powershell elevado no computador remoto.

Se a comunicação remota PS estiver ativada, um script modificado terá esta aparência:

$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.";
}
    
por 04.09.2018 / 14:47