Sử dụng thông tin đăng nhập PowerShell mà không được nhắc nhập mật khẩu


147

Tôi muốn khởi động lại một máy tính từ xa thuộc về một miền. Tôi có tài khoản quản trị viên nhưng tôi không biết cách sử dụng tài khoản này từ powershell.

Tôi biết rằng có một Restart-Computerlệnh ghép ngắn và tôi có thể vượt qua thông tin xác thực nhưng nếu tên miền của tôi là ví dụ mydomain, tên người dùng myusercủa tôi và mật khẩu của tôi là mypasswordcú pháp phù hợp để sử dụng nó?

Tôi cần lên lịch khởi động lại để không phải nhập mật khẩu.


Bạn nên đọc liên kết
ùn tắc

Tên miền get-cert01 \ admin01 nghĩa là gì? Lệnh tiếp theo là restart-computer -computername $ s -force -throttl006it 10 -credential $ c. Có nghĩa là get-cert lấy lại mật khẩu mà không hỏi nó?
mọi ánh mắt đổ dồn về tôi vào ngày

Câu trả lời:


202

Vấn đề với Get-Credentialnó là nó sẽ luôn nhắc nhập mật khẩu. Tuy nhiên, có một cách xoay quanh vấn đề này nhưng nó liên quan đến việc lưu trữ mật khẩu dưới dạng một chuỗi bảo mật trên hệ thống tập tin.

Bài viết sau đây giải thích cách thức hoạt động của nó:

Sử dụng PSCredentials mà không cần nhắc

Tóm lại, bạn tạo một tệp để lưu trữ mật khẩu của mình (dưới dạng một chuỗi được mã hóa). Dòng sau sẽ nhắc nhập mật khẩu sau đó lưu nó c:\mysecurestring.txtdưới dạng một chuỗi được mã hóa. Bạn chỉ cần làm điều này một lần:

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

Bất cứ nơi nào bạn thấy một -Credentialđối số trên lệnh PowerShell thì điều đó có nghĩa là bạn có thể vượt qua a PSCredential. Vì vậy, trong trường hợp của bạn:

$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>

Bạn có thể cần một -Authenticationgiá trị chuyển đổi khác vì tôi không biết môi trường của bạn.


23
Bạn cũng có thể làm ConvertTo-SecureString "password" -AsPlainText -Force.
x0n

14
Chỉ cần làm cho nó rõ ràng,$password = ConvertTo-SecureString "password" -AsPlainText -Force
Akira Yamamoto

-Credential [tên người dùng] được yêu cầu trong các tham số Read-Host đối với tôi, nếu không thì powershell chỉ bị treo. Sau khi chuyển -Credential đến máy chủ đọc, bạn sẽ được nhắc trực tiếp trong bảng điều khiển powershell và mật khẩu được lưu trữ chính xác. Cảm ơn bạn!
sephirot

Tôi đang cố gắng tìm ra cách để nó hoạt động khi tôi sử dụng chức năng Send-MailMessage trong powershell. Tôi muốn lưu trữ thông tin đăng nhập của người dùng email của tôi và vượt qua để tôi không phải tiếp tục nhập nó. Bạn có biết làm thế nào để làm điều này không?
KangarooRIOT

@ user3681591 - Tôi khuyên bạn nên hỏi một câu hỏi mới thay vì làm điều này trong các bình luận. Cảm ơn.
Kev

71

Có một cách khác, nhưng ...

ĐỪNG LÀM ĐIỀU NÀY NẾU BẠN KHÔNG MUỐN MẬT KHẨU CỦA BẠN TRONG TẬP TIN SCRIPT (Không nên lưu trữ mật khẩu trong các tập lệnh, nhưng một số người trong chúng ta chỉ muốn biết làm thế nào.)

Ok, đó là cảnh báo, đây là mã:

$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 sẽ có thông tin đăng nhập từ John Doe với mật khẩu "ABCDEF".

Phương tiện thay thế để có được mật khẩu sẵn sàng để sử dụng:

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

Cảm ơn. Điều này rất hữu ích. Trong trường hợp của tôi, tôi đã tạo một lệnh ghép ngắn powershell tùy chỉnh lấy tên người dùng và mật khẩu (dưới dạng SecureString). Bên trong cmdlet gọi một số lệnh ghép ngắn khác, một số chỉ cần một người dùng và mật khẩu nhưng một trong số họ cần một thông tin xác thực vì vậy tôi thực sự không cần phải mã hóa mật khẩu trong tập lệnh của mình.
BenR

20
Đơn giản hơn một chút: $ password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
Sam

Tôi đang cố gắng tìm ra cách để nó hoạt động khi tôi sử dụng chức năng Send-MailMessage trong powershell. Tôi muốn lưu trữ thông tin đăng nhập của người dùng email của tôi và vượt qua để tôi không phải tiếp tục nhập nó. Bạn có biết làm thế nào để làm điều này không?
KangarooRIOT

@ user3681591 Đó sẽ là Send-MailMessage -Credential $ credit (với $ credit được tạo như trong bài đăng này)
Jeroen Landheer

@JeroenLandheer Tôi đã thử câu trả lời của bạn (cảm ơn vì đã giúp đỡ!) Tuy nhiên nó không hoạt động. Lỗi của tôi là: -Credential: Thuật ngữ '-Credential' không được nhận dạng là tên của một lệnh ghép ngắn, hàm, tệp tập lệnh hoặc chương trình có thể hoạt động.
KangarooRIOT

29

Về lưu trữ thông tin đăng nhập, tôi sử dụng hai chức năng (thường là trong một mô-đun được tải từ hồ sơ của tôi):

#=====================================================================
# 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
}

Và cái này nữa:

#=====================================================================
# 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
}

Bạn sử dụng nó như thế này:

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

Nếu tệp thông tin không tồn tại, bạn sẽ được nhắc lần đầu tiên, tại thời điểm đó, nó sẽ lưu trữ thông tin đăng nhập trong một chuỗi được mã hóa bên trong tệp XML. Lần thứ hai bạn chạy dòng đó, xmlfile ở đó và sẽ được mở tự động.


10

Tôi phải chạy các chức năng SCOM 2012 từ một máy chủ từ xa yêu cầu thông tin xác thực khác. Tôi tránh mật khẩu văn bản rõ ràng bằng cách chuyển đầu ra của chức năng giải mã mật khẩu làm đầu vào cho ConvertTo-SecureString. Để rõ ràng, điều này không được hiển thị ở đây.

Tôi thích gõ mạnh những tuyên bố của tôi. Khai báo kiểu cho $ strPass hoạt động chính xác.

[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

Dưới đây là hai cách bạn có thể làm điều này, nếu bạn đang lên lịch khởi động lại.

Trước tiên, bạn có thể tạo một tác vụ trên một máy bằng thông tin đăng nhập có quyền cần thiết để kết nối và khởi động lại máy khác. Điều này làm cho bộ lập lịch chịu trách nhiệm lưu trữ an toàn các thông tin đăng nhập. Lệnh khởi động lại (Tôi là một anh chàng Powershell, nhưng điều này sạch hơn.) Là:

SHUTDOWN /r /f /m \\ComputerName

Dòng lệnh để tạo một tác vụ theo lịch trình trên máy cục bộ, để khởi động lại từ xa khác, sẽ là:

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"

Tôi thích cách thứ hai, nơi bạn sử dụng thông tin đăng nhập hiện tại của mình để tạo một tác vụ theo lịch trình chạy với tài khoản hệ thống trên một máy từ xa.

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

Điều này cũng hoạt động thông qua GUI, chỉ cần nhập HỆ THỐNG làm tên người dùng, để trống các trường mật khẩu.


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

Hãy cẩn thận với việc lưu trữ mật khẩu theo cách này ... nó không an toàn như ...


1

Tôi đã thấy một ví dụ sử dụng Nhập / Xuất-CLIXML.

Đây là những lệnh yêu thích của tôi cho vấn đề bạn đang cố gắng giải quyết. Và cách đơn giản nhất để sử dụng chúng là.

$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

Vì vậy, nếu tệp không tồn tại cục bộ, nó sẽ nhắc thông tin đăng nhập và lưu trữ chúng. Điều này sẽ lấy một [pscredential]đối tượng mà không có vấn đề và sẽ ẩn thông tin đăng nhập dưới dạng một chuỗi bảo mật.

Cuối cùng chỉ cần sử dụng thông tin như bạn thường làm.

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

Lưu ý về Bảo mật :

Lưu trữ an toàn thông tin đăng nhập trên đĩa

Khi đọc Giải pháp, ban đầu bạn có thể cảnh giác khi lưu trữ mật khẩu trên đĩa. Mặc dù việc thận trọng khi xả rác ổ cứng với thông tin nhạy cảm là điều tự nhiên (và thận trọng), lệnh ghép ngắn Xuất-CliXml mã hóa các đối tượng thông tin bằng API bảo vệ dữ liệu tiêu chuẩn của Windows. Điều này đảm bảo rằng chỉ có tài khoản người dùng của bạn có thể giải mã chính xác nội dung của nó. Tương tự, lệnh ghép ngắn ConvertFrom-SecureString cũng mã hóa mật khẩu bạn cung cấp.

Chỉnh sửa: Chỉ cần đọc lại câu hỏi ban đầu. Ở trên sẽ hoạt động miễn là bạn đã khởi tạo [pscredential]đĩa cứng. Đó là nếu bạn bỏ tập lệnh đó vào tập lệnh của mình và chạy tập lệnh một lần thì nó sẽ tạo tập tin đó và sau đó chạy tập lệnh không giám sát sẽ đơn giản.


1

Giải pháp

$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

Đối với máy xây dựng
Trong mã trước thay thế các giá trị mật khẩu và tên người dùng bằng các biến môi trường ("ẩn khỏi nhật ký") của máy xây dựng của bạn

Kết quả kiểm tra bằng

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

và bạn sẽ thấy

# Results
test-domain
test-login
test-password

-3

Tại sao bạn không thử một cái gì đó rất đơn giản?

sử dụng psexec với lệnh 'shutdown / r / f / t 0' và danh sách PC từ CMD.


Đó là một trường hợp cụ thể. Điểm không sinh ra một cửa sổ đăng nhập trong bất kỳ kịch bản ngẫu nhiên.
Overmind
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.