도메인에 속한 원격 컴퓨터를 다시 시작하고 싶습니다. 관리자 계정이 있지만 powershell에서 사용하는 방법을 모르겠습니다.
나는이 있음을 알고 Restart-Computer
cmdlet을 내가 자격 통과 할 수 있지만 내 도메인은 예를 들어 경우 mydomain
, 내 이름은 myuser
내 비밀번호는mypassword
올바른 구문 인 이유 무엇입니까?
비밀번호를 입력 할 필요가 없도록 재부팅을 예약해야합니다.
도메인에 속한 원격 컴퓨터를 다시 시작하고 싶습니다. 관리자 계정이 있지만 powershell에서 사용하는 방법을 모르겠습니다.
나는이 있음을 알고 Restart-Computer
cmdlet을 내가 자격 통과 할 수 있지만 내 도메인은 예를 들어 경우 mydomain
, 내 이름은 myuser
내 비밀번호는mypassword
올바른 구문 인 이유 무엇입니까?
비밀번호를 입력 할 필요가 없도록 재부팅을 예약해야합니다.
답변:
문제 Get-Credential
는 항상 암호를 요구한다는 것입니다. 그러나이 문제를 해결할 수있는 방법이 있지만 파일 시스템에 비밀번호를 보안 문자열로 저장하는 것이 포함됩니다.
다음 기사에서는이 방법을 설명합니다.
요약하면 암호를 암호화 된 문자열로 저장할 파일을 만듭니다. 다음 줄은 비밀번호를 묻는 메시지를 표시 한 다음 c:\mysecurestring.txt
암호화 된 문자열로 저장 합니다. 이 작업은 한 번만 수행하면됩니다.
read-host -assecurestring | convertfrom-securestring | out-file C:\mysecurestring.txt
-Credential
PowerShell 명령에 인수가 표시되면를 전달할 수 있다는 의미 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
환경을 모르기 때문에 다른 스위치 값 이 필요할 수 있습니다 .
ConvertTo-SecureString "password" -AsPlainText -Force
.
$password = ConvertTo-SecureString "password" -AsPlainText -Force
다른 방법이 있지만 ...
스크립트 파일에 비밀번호를 입력 하지 않으려면이 방법을 사용하지 마십시오 (스크립트에 비밀번호를 저장하는 것은 좋지 않지만 일부는 방법을 알고 싶어합니다).
좋아요, 경고였습니다. 코드는 다음과 같습니다.
$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
자격 증명 저장과 관련하여 두 가지 기능 (일반적으로 내 프로필에서로드 된 모듈에 있음)을 사용합니다.
#=====================================================================
# 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이 있으며 자동으로 열립니다.
다른 자격 증명이 필요한 원격 서버에서 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)
재부팅을 예약 할 경우 다음과 같은 두 가지 방법을 사용할 수 있습니다.
먼저 다른 컴퓨터를 연결하고 재부팅하는 데 필요한 권한이있는 자격 증명을 사용하여 한 컴퓨터에서 작업을 만들 수 있습니다. 그러면 스케줄러가 신임 정보를 안전하게 저장해야합니다. 재부팅 명령 (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을 입력하고 암호 필드는 비워 두십시오.
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
이런 식으로 암호를 저장하는 데 매우주의하십시오 ... 안전하지 않습니다 ...
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]
내용은 하드 디스크를 초기화 한 경우에만 작동합니다 . 스크립트에서 파일을 삭제하고 스크립트를 실행하면 해당 파일을 만든 다음 스크립트를 무인으로 실행하는 것이 간단합니다.
해결책
$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