암호를 묻지 않고 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.