2011-06-04 34 views
117

Tôi muốn khởi động lại máy tính từ xa thuộc về miền. Tôi có một tài khoản quản trị viên nhưng tôi không biết cách sử dụng nó từ PowerShell.Sử dụng thông tin đăng nhập PowerShell mà không bị nhắc nhập mật khẩu

Tôi biết rằng có một lệnh Restart-Computer và rằng tôi có thể vượt qua chứng chỉ nhưng nếu tên miền của tôi là ví dụ mydomain, tên người dùng của tôi là myuser và mật khẩu của tôi là mypassword đúng cú pháp để sử dụng nó là gì?

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

+0

Bạn nên đọc [link] này (http://technet.microsoft.com/en-us/library/dd315301.aspx) – jams

+0

Tên miền nhận được chứng chỉ01 \ admin01 nghĩa là gì? Lệnh tiếp theo là restart-computer -computername $ s-force -throttlelimit 10 -credential $ c. Nó có nghĩa là get-credentials lấy mật khẩu mà không hỏi nó? –

+0

http://technet.microsoft.com/en-us/library/dd315327.aspx – jams

Trả lời

170

Sự cố với Get-Credential là sự cố sẽ luôn nhắc nhập mật khẩu. Có một cách xung quanh này tuy nhiên nhưng nó liên quan đến việc lưu trữ mật khẩu như một chuỗi an toàn trên hệ thống tập tin.

Bài viết sau đây giải thích cách làm việc này:

Using PSCredentials without a prompt

Nói tóm lại, bạn tạo một tập tin để lưu trữ mật khẩu của bạn (như là một chuỗi được mã hóa). Dòng sau sẽ nhắc mật khẩu, sau đó lưu trữ nó trong c:\mysecurestring.txt dưới dạng 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 nhìn thấy một cuộc tranh luận -Credential trên một lệnh PowerShell sau đó nó có nghĩa là bạn có thể vượt qua một 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 giá trị chuyển đổi -Authentication khác vì tôi không biết môi trường của bạn.

+18

Bạn cũng có thể thực hiện mật khẩu 'ConvertTo-SecureString '" -AsPlainText -Force'. – x0n

+11

Chỉ cần làm rõ, mật khẩu '$ password = ConvertTo-SecureString" -AsPlainText -Force' –

+0

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

25

Về thông tin lưu trữ, tôi sử dụng hai chức năng (nghĩa là bình thường trong một mô-đun được nạp 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à điều này một:

#===================================================================== 
# 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 xác thực không tồn tại, bạn sẽ được nhắc lần đầu tiên, tại tha t điểm nó sẽ lưu trữ các thông tin trong một chuỗi được mã hóa bên trong một tập tin XML. Lần thứ hai bạn chạy dòng đó, xmlfile là ở đó và sẽ được mở tự động.

58

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

KHÔNG LÀM NÀY NẾU BẠN KHÔNG MUỐN PASSWORD CỦA BẠN TRONG FILE SCRIPT (Nó không phải là một ý tưởng tốt để lưu trữ mật khẩu trong kịch bản, 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à các 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ó các chứng từ John Doe với mật khẩu "ABCDEF".

Alternative nghĩa để có được mật khẩu đã sẵn sàng để sử dụng:

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

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 ra 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 (như secureString). Trong cmdlet nội bộ 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 chứng chỉ vì vậy tôi không thực sự cần phải mã hóa mật khẩu trong kịch bản của tôi. – BenR

+16

Hơi đơn giản: $ password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force – Sam

+0

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

3

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

Trước tiên, bạn có thể tạo tác vụ trên một máy bằng thông tin đăng nhập có quyền cần kết nối và khởi động lại máy khác. Điều này làm cho người lên 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 chàng trai Powershell, nhưng đây là sạch) là:

SHUTDOWN /r /f /m \\ComputerName

các dòng lệnh để tạo ra một nhiệm vụ theo lịch trình trên máy cục bộ, phải 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 xác thực hiện tại để tạo tác vụ theo lịch chạy bằng tài khoản hệ thống trên 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

này cũng làm việc thông qua giao diện đồ họa, chỉ cần nhập HỆ THỐNG như tên người dùng, để lại các lĩnh vực mật khẩu trống.

0
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 rất cẩn thận với lưu trữ mật khẩu theo cách này ... nó không phải là an toàn như ...

7

tôi phải chạy SCOM 2012 chức năng từ một máy chủ từ xa mà đòi hỏi một chứng chỉ khác nhau. 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 hàm 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 đánh mạnh các tuyên bố của mình. 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) 
-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.

+0

Đó là một trường hợp cụ thể. Vấn đề không phải là sinh ra một cửa sổ đăng nhập trong bất kỳ kịch bản ngẫu nhiên nào. – Overmind

Các vấn đề liên quan