การใช้ข้อมูลรับรอง PowerShell โดยไม่ต้องใส่รหัสผ่าน


147

ฉันต้องการรีสตาร์ทคอมพิวเตอร์ระยะไกลที่เป็นของโดเมน ฉันมีบัญชีผู้ดูแลระบบ แต่ฉันไม่ทราบวิธีการใช้งานจาก powershell

ฉันรู้ว่ามีRestart-Computercmdlet และฉันสามารถส่งหนังสือรับรอง แต่ถ้าโดเมนmydomainของฉันเป็นชื่อผู้ใช้myuserของฉันและรหัสผ่านของฉันคือmypasswordสิ่งที่ไวยากรณ์ที่เหมาะสมที่จะใช้หรือไม่

ฉันต้องการกำหนดเวลาการรีบูตดังนั้นฉันจึงไม่ต้องพิมพ์รหัสผ่าน


คุณควรอ่านลิงค์
jams

get-credential domain01 \ admin01 หมายถึงอะไร คำสั่งถัดไปคือรีสตาร์ทคอมพิวเตอร์ -computername $ s -force -throttlelimit 10 -credential $ c หมายความว่า get-credential ดึงรหัสผ่านโดยไม่ถามหรือไม่
eyez ทั้งหมดสำหรับฉัน

คำตอบ:


202

ปัญหาGet-Credentialคือมันจะให้รหัสผ่านเสมอ มีวิธีแก้ไขปัญหานี้ แต่มันเกี่ยวข้องกับการจัดเก็บรหัสผ่านเป็นสายอักขระที่ปลอดภัยบนระบบแฟ้ม

บทความต่อไปนี้อธิบายวิธีการทำงาน:

ใช้ PSCredentials โดยไม่ต้องแจ้ง

โดยสรุปคุณสร้างไฟล์เพื่อเก็บรหัสผ่านของคุณ (เป็นสตริงเข้ารหัส) บรรทัดต่อไปนี้จะถามรหัสผ่านจากนั้นเก็บไว้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เปลี่ยนค่าที่แตกต่างกันเพราะฉันไม่รู้จักสภาพแวดล้อมของคุณ


23
ConvertTo-SecureString "password" -AsPlainText -Forceนอกจากนี้คุณยังสามารถทำ
x0n

14
เพียงเพื่อให้ชัดเจน$password = ConvertTo-SecureString "password" -AsPlainText -Force
Akira Yamamoto

-จำเป็นต้องมี[ชื่อผู้ใช้]ในพารามิเตอร์ Read-Host สำหรับฉันมิฉะนั้น PowerShell ก็หยุดทำงาน หลังจากผ่าน -Credential ไปยังโฮสต์การอ่านคุณจะถูกถามโดยตรงใน PowerShell console และรหัสผ่านจะถูกเก็บไว้อย่างถูกต้อง ขอบคุณ!
sephirot

ฉันกำลังพยายามหาวิธีที่จะทำให้มันใช้งานได้เมื่อฉันใช้ฟังก์ชั่น Send-MailMessage ใน PowerShell ฉันต้องการจัดเก็บข้อมูลรับรองของผู้ใช้อีเมลของฉันและส่งผ่านดังนั้นฉันไม่จำเป็นต้องป้อนข้อมูลต่อไปความคิดใด ๆ ในการทำเช่นนี้?
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

ขอบคุณ สิ่งนี้มีประโยชน์มาก ในกรณีของฉันฉันกำลังสร้าง cmdlet powershell ที่กำหนดเองที่ใช้ชื่อผู้ใช้และรหัสผ่าน (เป็น secureString) ภายใน cmdlet เรียกใช้ cmdlet อื่น ๆ หลายแห่งบางคนต้องการเพียงแค่ผู้ใช้และรหัสผ่าน แต่หนึ่งในนั้นต้องการข้อมูลประจำตัวดังนั้นฉันไม่จำเป็นต้องเขียนรหัสผ่านในสคริปต์ของฉัน
BenR

20
ค่อนข้างง่ายกว่า: $ password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
Sam

ฉันกำลังพยายามหาวิธีที่จะทำให้มันใช้งานได้เมื่อฉันใช้ฟังก์ชั่น Send-MailMessage ใน PowerShell ฉันต้องการจัดเก็บข้อมูลรับรองของผู้ใช้อีเมลของฉันและส่งผ่านดังนั้นฉันไม่จำเป็นต้องป้อนข้อมูลต่อไปความคิดใด ๆ ในการทำเช่นนี้?
KangarooRIOT

@ user3681591 นั่นคือ Send-MailMessage -Credential $ credit (โดยสร้าง $ credit ตามที่แสดงในโพสต์นี้)
Jeroen 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

ต่อไปนี้เป็นสองวิธีที่คุณสามารถทำได้หากคุณกำหนดเวลาการรีบูต

ก่อนอื่นคุณสามารถสร้างงานบนเครื่องหนึ่งโดยใช้ข้อมูลรับรองที่มีสิทธิ์ที่จำเป็นในการเชื่อมต่อและรีบูตเครื่องอื่น สิ่งนี้ทำให้ตัวกำหนดตารางเวลารับผิดชอบการจัดเก็บข้อมูลรับรองอย่างปลอดภัย คำสั่ง reboot (ฉันเป็นผู้ชาย 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

ฉันเห็นตัวอย่างหนึ่งที่ใช้นำเข้า / ส่งออก -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

หมายเหตุเกี่ยวกับความปลอดภัย :

จัดเก็บข้อมูลรับรองอย่างปลอดภัยบนดิสก์

เมื่ออ่านโซลูชันในตอนแรกคุณอาจระวังการจัดเก็บรหัสผ่านไว้ในดิสก์ แม้ว่าจะเป็นเรื่องธรรมดา (และระมัดระวัง) ในการระมัดระวังการทิ้งฮาร์ดไดรฟ์ของคุณด้วยข้อมูลที่ละเอียดอ่อน แต่ Export-CliXml cmdlet จะเข้ารหัสวัตถุข้อมูลรับรองโดยใช้ API การปกป้องข้อมูลมาตรฐานของ Windows สิ่งนี้ทำให้มั่นใจได้ว่าเฉพาะบัญชีผู้ใช้ของคุณเท่านั้นที่สามารถถอดรหัสเนื้อหาได้อย่างถูกต้อง ในทำนองเดียวกัน cmdlet ConvertFrom-SecureString ยังเข้ารหัสรหัสผ่านที่คุณให้

แก้ไข: เพียงอ่านคำถามเดิมอีกครั้ง ข้างต้นจะทำงานตราบใดที่คุณได้เริ่มต้นการ[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' และรายการ PC จาก CMD


นั่นเป็นกรณีเฉพาะ จุดไม่ได้วางไข่หน้าต่างเข้าสู่ระบบในสถานการณ์สุ่มใด ๆ
เอาชนะ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.