내 조직의 원격 컴퓨터에 대한 로컬 관리자 비밀번호를 재설정하기 위한 스크립트를 생성하려고 합니다. 저는 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.";
}