Powershell을 사용하여 원격 컴퓨터의 로컬 관리자 비밀번호 재설정

Powershell을 사용하여 원격 컴퓨터의 로컬 관리자 비밀번호 재설정

내 조직의 원격 컴퓨터에 대한 로컬 관리자 비밀번호를 재설정하기 위한 스크립트를 생성하려고 합니다. 저는 Powershell을 처음 접했고 그 과정에서 시도하고 실패하면서 대부분을 배우고 있습니다. 지금까지 내가 가지고 있는 스크립트는 다음과 같습니다.

Import-Module ActiveDirectory
$computer = Read-Host -Prompt "Enter computer Name Here"
$password = Read-Host -Prompt "Enter Password Here"
Set-ADAccountPassword - Identity $computer -NewPassword $password

어리석은 실수일 가능성이 높으므로 부드럽게 대해주세요 :)

답변1

TL;DR

나는 다른 대답에 동의합니다.PowerShell ADSI 어댑터이를 위해 작동합니다. 또한 대화형으로 자격 증명을 제공하려면 을 사용 Get-Credential하지 말고 를 사용해야 한다는 의견에 동의합니다 Read-Host.


제가 한 방법은 다음과 같습니다. 일부 웹사이트에서 이 스크립트를 가져온 것 같은데 댓글을 달지 않았거나 출처를 추적하지 않았기 때문에 크레딧을 제공할 수 없다는 것이 당황스럽습니다.

준비

먼저 내 스크립트는 연결을 테스트합니다.

if((Test-Connection -ComputerName $Computer -count 1 -ErrorAction 0)) {
    $Isonline = "ONLINE"
    Write-Verbose "`t$Computer is Online"
} else { Write-Verbose "`t$Computer is OFFLINE" }

비밀번호 변경

그런 다음 내 스크립트는 try/catch비밀번호 설정을 시도하고 성공 또는 실패를 기록하고 보고합니다.

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: $_"
}

여기에는 몇 가지 차이점이 있습니다. 먼저 변경하려는 계정의 사용자 이름을 미리 알고 있었습니다(내 스크립트는 모든 로컬 관리자 비밀번호를 한 번에 변경하는 것이었습니다). 당신이 사용할 수있는

$user = [adsi]"WinNT://$computer/$($credential.GetNetworkCredential().Username),user"

대신 다른 답변에서 언급했듯이. 또한 내 스크립트(2012 R2 서버에서 나에게 효과적임) $user.psbase.invoke("setpassword",$password)$user.SetPassword($password). 솔직히 말해서 차이점이 무엇인지, 한 쪽이 다른 쪽보다 더 잘 작동하는지 모르겠습니다.

보고

마지막으로 내 스크립트는 성공/실패를 보고합니다. 이는 모든 로컬 관리자 비밀번호를 업데이트하기 위해 환경의 모든 서버를 반복하는 데 스크립트를 사용했기 때문입니다. 따라서 어떤 서버가 실패했는지 알아야 했기 때문에 수동으로 돌아가서 문제를 해결할 수 있었습니다. 이것은 당신에게 전혀 필요하지 않을 수도 있습니다.

$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")
}

답변2

Powershell 5.0 이하를 사용하는 경우 Powershell ADSI 어댑터를 사용하여 원격 컴퓨터에서 로컬 사용자 계정을 조작해야 합니다.

$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();

실제로 연결을 시도하기 전에 원격 컴퓨터를 ping할 수 있는지 확인하고 사용자가 자격 증명 입력 대화 상자에서 취소를 클릭하면 해당 경우를 처리할 수 있습니다.

$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.";
}

편집하다:Windows 10 빌드 1607에서는 새로운 Powershell 5.1에 이 Set-LocalUser명령이 도입되었습니다. 이 작업에 ADSI 어댑터 대신 사용할 수 있지만 원격 컴퓨터에서 Powershell 원격 서비스를 활성화해야 합니다(기본적으로 비활성화되어 있음). 원격 명령 수락을 허용하려면 Enable-PSRemoting원격 컴퓨터의 관리자 권한 Powershell 터미널에서 실행을 실행해야 합니다 .

PS 원격이 활성화된 경우 수정된 스크립트는 다음과 같습니다.

$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.";
}

관련 정보