암호를 묻지 않고 PowerShell 자격 증명 사용


147

도메인에 속한 원격 컴퓨터를 다시 시작하고 싶습니다. 관리자 계정이 있지만 powershell에서 사용하는 방법을 모르겠습니다.

나는이 있음을 알고 Restart-Computercmdlet을 내가 자격 통과 할 수 있지만 내 도메인은 예를 들어 경우 mydomain, 내 이름은 myuser내 비밀번호는mypassword 올바른 구문 인 이유 무엇입니까?

비밀번호를 입력 할 필요가 없도록 재부팅을 예약해야합니다.


이 읽어야 링크
— 걸림

자격 증명 취득 도메인 01 \ admin01의 의미는 무엇입니까? 다음 명령은 restart-computer -computername $ s -force -throttlelimit 10 -credential $ c입니다. get-credential이 비밀번호를 묻지 않고 검색 함을 의미합니까?
— 모든 onz on

답변:


202

문제 Get-Credential는 항상 암호를 요구한다는 것입니다. 그러나이 문제를 해결할 수있는 방법이 있지만 파일 시스템에 비밀번호를 보안 문자열로 저장하는 것이 포함됩니다.

다음 기사에서는이 방법을 설명합니다.

프롬프트없이 PSCredentials 사용

요약하면 암호를 암호화 된 문자열로 저장할 파일을 만듭니다. 다음 줄은 비밀번호를 묻는 메시지를 표시 한 다음 c:\mysecurestring.txt암호화 된 문자열로 저장 합니다. 이 작업은 한 번만 수행하면됩니다.

read-host -assecurestring | convertfrom-securestring | out-file C:\mysecurestring.txt

-CredentialPowerShell 명령에 인수가 표시되면를 전달할 수 있다는 의미 PSCredential입니다. 따라서 귀하의 경우 :

$username = "domain01\admin01"
$password = Get-Content 'C:\mysecurestring.txt' | ConvertTo-SecureString
$cred = new-object -typename System.Management.Automation.PSCredential `
         -argumentlist $username, $password

$serverNameOrIp = "192.168.1.1"
Restart-Computer -ComputerName $serverNameOrIp `
                 -Authentication default `
                 -Credential $cred
                 <any other parameters relevant to you>

-Authentication환경을 모르기 때문에 다른 스위치 값 이 필요할 수 있습니다 .


23
당신은 또한 할 수 있습니다 ConvertTo-SecureString "password" -AsPlainText -Force.
— x0n

14
명확하게하기 위해,$password = ConvertTo-SecureString "password" -AsPlainText -Force
— Yamamoto Akira

-읽기 호스트 매개 변수에 자격 증명 [사용자 이름] 이 필요했습니다. 그렇지 않으면 powershell이 ​​중단됩니다. -Credential을 read-host로 전달하면 powershell 콘솔에 직접 프롬프트되고 암호가 올바르게 저장됩니다. 감사합니다!
— sephirot

powershell에서 Send-MailMessage 함수를 사용할 때 어떻게 작동하는지 알아 내려고합니다. 전자 메일 사용자의 자격 증명을 저장하고 전달하려고하므로 계속 입력 할 필요가 없습니다.
— KangarooRIOT

@ user3681591-의견 에서이 작업을 수행하는 대신 새로운 질문을하는 것이 좋습니다. 감사.
— Kev

71

다른 방법이 있지만 ...

스크립트 파일에 비밀번호를 입력 하지 않으려면이 방법을 사용하지 마십시오 (스크립트에 비밀번호를 저장하는 것은 좋지 않지만 일부는 방법을 알고 싶어합니다).

좋아요, 경고였습니다. 코드는 다음과 같습니다.

$username = "John Doe"
$password = "ABCDEF"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr

$cred John Doe의 신임 정보에 비밀번호 "ABCDEF"가 있습니다.

비밀번호 사용 준비를위한 대체 수단 :

$password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force

감사. 이것은 매우 도움이됩니다. 필자의 경우 사용자 이름과 암호 (secureString)를 사용하는 사용자 지정 powershell cmdlet을 만들었습니다. 내부적으로 cmdlet은 다른 여러 cmdlet을 호출하는데 일부는 사용자와 암호 만 필요하지만 그 중 하나는 자격 증명이 필요하므로 실제로 스크립트에서 암호를 하드 코딩 할 필요는 없습니다.
— BenR

20
좀 더 간단합니다 : $ password = convertto-securestring-문자열 "notverysecretpassword"-AsPlainText -Force
— Sam

powershell에서 Send-MailMessage 함수를 사용할 때 어떻게 작동하는지 알아 내려고합니다. 전자 메일 사용자의 자격 증명을 저장하고 전달하기 위해 계속 입력 할 필요가 없습니다. 어떻게해야할지 잘 모릅니다.
— KangarooRIOT

@ user3681591 될 것이라고 보내기-은 MailMessage -Credential $ cred하게 ($ 생성 CRED에이 게시물 참조)
— 제론 Landheer을

@JeroenLandheer 귀하의 답변을 시도했지만 (도움을 주셔서 감사합니다!) 작동하지 않았습니다. 내 오류는 다음과 같습니다. -Credential : '-Credential'이라는 용어는 cmdlet, 함수, 스크립트 파일 또는 작동 가능한 프로그램의 이름으로 인식되지 않습니다.
— KangarooRIOT

29

자격 증명 저장과 관련하여 두 가지 기능 (일반적으로 내 프로필에서로드 된 모듈에 있음)을 사용합니다.

#=====================================================================
# Get-MyCredential
#=====================================================================
function Get-MyCredential
{
param(
$CredPath,
[switch]$Help
)
$HelpText = @"

    Get-MyCredential
    Usage:
    Get-MyCredential -CredPath `$CredPath

    If a credential is stored in $CredPath, it will be used.
    If no credential is found, Export-Credential will start and offer to
    Store a credential at the location specified.

"@
    if($Help -or (!($CredPath))){write-host $Helptext; Break}
    if (!(Test-Path -Path $CredPath -PathType Leaf)) {
        Export-Credential (Get-Credential) $CredPath
    }
    $cred = Import-Clixml $CredPath
    $cred.Password = $cred.Password | ConvertTo-SecureString
    $Credential = New-Object System.Management.Automation.PsCredential($cred.UserName, $cred.Password)
    Return $Credential
}

그리고 이것:

#=====================================================================
# Export-Credential
# Usage: Export-Credential $CredentialObject $FileToSaveTo
#=====================================================================
function Export-Credential($cred, $path) {
      $cred = $cred | Select-Object *
      $cred.password = $cred.Password | ConvertFrom-SecureString
      $cred | Export-Clixml $path
}

당신은 이것을 다음과 같이 사용합니다 :

$Credentials = Get-MyCredential (join-path ($PsScriptRoot) Syncred.xml)

신임 정보 파일이 존재하지 않으면 처음 프롬프트가 표시되며, 이때 신임 정보가 XML 파일 내부의 암호화 된 문자열에 저장됩니다. 두 번째로 해당 행을 실행하면 xmlfile이 있으며 자동으로 열립니다.


10

다른 자격 증명이 필요한 원격 서버에서 SCOM 2012 기능을 실행해야합니다. 암호 해독 기능의 출력을 ConvertTo-SecureString에 입력으로 전달하여 일반 텍스트 암호를 피합니다. 명확성을 위해 여기에 표시되지 않습니다.

나는 나의 선언을 강력하게 입력하고 싶다. $ strPass에 대한 형식 선언이 올바르게 작동합니다.

[object] $objCred = $null
[string] $strUser = 'domain\userID'
[System.Security.SecureString] $strPass = '' 

$strPass = ConvertTo-SecureString -String "password" -AsPlainText -Force
$objCred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($strUser, $strPass)

4

재부팅을 예약 할 경우 다음과 같은 두 가지 방법을 사용할 수 있습니다.

먼저 다른 컴퓨터를 연결하고 재부팅하는 데 필요한 권한이있는 자격 증명을 사용하여 한 컴퓨터에서 작업을 만들 수 있습니다. 그러면 스케줄러가 신임 정보를 안전하게 저장해야합니다. 재부팅 명령 (Powershell 사용자이지만 더 깨끗합니다)은 다음과 같습니다.

SHUTDOWN /r /f /m \\ComputerName

로컬 시스템에서 예약 된 작업을 생성하고 다른 시스템을 원격으로 재부팅하기위한 명령 줄은 다음과 같습니다.

SCHTASKS /Create /TN "Reboot Server" /TR "shutdown.exe /r /f /m \\ComputerName" /SC ONCE /ST 00:00 /SD "12/24/2012" /RU "domain\username" /RP "password"

현재 자격 증명을 사용하여 원격 컴퓨터의 시스템 계정으로 실행되는 예약 된 작업을 만드는 두 번째 방법을 선호합니다.

SCHTASKS /Create /TN "Reboot Server" /TR "shutdown.exe /r /f" /SC ONCE /ST 00:00 /SD "12/24/2012" /RU SYSTEM /S ComputerName

이것은 GUI를 통해서도 작동하며, 사용자 이름으로 SYSTEM을 입력하고 암호 필드는 비워 두십시오.


1
read-host -assecurestring | convertfrom-securestring | out-file C:\securestring.txt
$pass = cat C:\securestring.txt | convertto-securestring
$mycred = new-object -typename System.Management.Automation.PSCredential -argumentlist "test",$pass
$mycred.GetNetworkCredential().Password

이런 식으로 암호를 저장하는 데 매우주의하십시오 ... 안전하지 않습니다 ...


1

Import / Export-CLIXML을 사용하는 예제를 보았습니다.

이들은 내가 해결하려는 문제에 대해 내가 가장 좋아하는 명령입니다. 그리고 가장 간단한 방법은 그것들을 사용하는 것입니다.

$passwordPath = './password.txt'
if (-not (test-path $passwordPath)) {
    $cred = Get-Credential -Username domain\username -message 'Please login.'
    Export-Cli -InputObject $cred -Path $passwordPath
}
$cred = Import-CliXML -path $passwordPath

따라서 파일이 로컬에 존재하지 않으면 자격 증명을 입력하라는 메시지가 표시됩니다. 이것은 [pscredential]문제없이 객체를 가져 오고 자격 증명을 보안 문자열로 숨 깁니다.

마지막으로 평소처럼 자격 증명을 사용하십시오.

Restart-Computer -ComputerName ... -Credentail $cred

Securty에 대한 참고 사항 :

디스크에 자격 증명을 안전하게 저장

솔루션을 읽을 때 처음에는 디스크에 비밀번호를 저장하는 것에주의해야합니다. 중요한 정보를 사용하여 하드 드라이브를 폐기하는 것은 자연스럽고 신중한 일이지만 Export-CliXml cmdlet은 Windows 표준 데이터 보호 API를 사용하여 자격 증명 개체를 암호화합니다. 이를 통해 사용자 계정 만 내용을 올바르게 해독 할 수 있습니다. 마찬가지로 ConvertFrom-SecureString cmdlet도 사용자가 제공 한 암호를 암호화합니다.

편집 : 원래 질문을 다시 읽으십시오. 위의 [pscredential]내용은 하드 디스크를 초기화 한 경우에만 작동합니다 . 스크립트에서 파일을 삭제하고 스크립트를 실행하면 해당 파일을 만든 다음 스크립트를 무인으로 실행하는 것이 간단합니다.


1

해결책

$userName = 'test-domain\test-login'
$password = 'test-password'

$pwdSecureString = ConvertTo-SecureString -Force -AsPlainText $password
$credential = New-Object -TypeName System.Management.Automation.PSCredential `
    -ArgumentList $userName, $pwdSecureString

빌드 머신에 대한
당신의 ( "로그에서 숨겨진")의 비밀 환경 변수에 의해 사용자 이름 및 암호 값을 대체 이전 코드에서 빌드 기계

시험 결과 에 의해

'# Results'
$credential.GetNetworkCredential().Domain
$credential.GetNetworkCredential().UserName
$credential.GetNetworkCredential().Password

그리고 당신은 볼 수 있습니다

# Results
test-domain
test-login
test-password

-3

왜 간단한 것을 시도하지 않습니까?

psexec를 'shutdown / r / f / t 0'명령과 함께 사용하고 CMD의 PC 목록을 사용하십시오.


특정한 경우입니다. 임의의 시나리오에서 포인트가 로그인 창을 생성하지 않습니다.
— Overmind
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.