2009-10-07 43 views
18

Bối cảnh: Giả sử tôi sử dụng tập lệnh PowerShell sau từ máy cục bộ để tự động ánh xạ một số ổ đĩa mạng.Powershell: cách ánh xạ ổ đĩa mạng với tên người dùng/mật khẩu khác nhau

$net = $(New-Object -ComObject WScript.Network); 
$net.MapNetworkDrive("p:", "\\papabox\files"); 

$net = $(New-Object -ComObject WScript.Network); 
$net.MapNetworkDrive("q:", "\\quebecbox\files"); 

## problem -- this one does not work because my username/password 
## is different on romeobox 
$net = $(New-Object -ComObject WScript.Network); 
$net.MapNetworkDrive("r:", "\\romeobox\files"); 

Câu hỏi: Làm thế nào để thay đổi kịch bản vì vậy mà tôi cũng có thể kết nối với romeobox, mặc dù tên tôi/mật khẩu trên romeobox là khác với hai hộp khác?

Trả lời

33
$net = new-object -ComObject WScript.Network 
$net.MapNetworkDrive("r:", "\\romeobox\files", $false, "domain\user", "password") 

Nên làm các trick,

Kindness,

Dan

+0

Vì tò mò, mục đích của $ false là gì, có lẽ là giá trị trả về? Đã tìm kiếm nhưng không thể tìm thấy tài liệu cho MapNetworkDrive ... – Nagev

0

này nên làm việc:

$net = $(New-Object -ComObject WScript.Network) 
$net.MapNetworkDrive("r:", "\\romeobox\files",,"username","password") 
+0

Cảm ơn, chỉ cần lưu ý: tham số bị thiếu trước "tên người dùng" khiến PS khiếu nại. Khác hơn là nó hoạt động! – dreftymac

+0

Câu trả lời này chứa một sai lầm cần được sửa chữa. Nó có thể gây nhầm lẫn cho người dùng ít kinh nghiệm hơn. – Kris

12

Nếu bạn cần một cách để lưu trữ các mật khẩu mà không đặt nó trong văn bản thuần túy trong tập lệnh hoặc tệp dữ liệu, bạn có thể sử dụng DPAPI để bảo vệ mật khẩu để bạn có thể lưu trữ i t an toàn trong một tệp và truy xuất sau này dưới dạng văn bản thuần túy, ví dụ:

# Stick password into DPAPI storage once - accessible only by current user 
Add-Type -assembly System.Security 
$passwordBytes = [System.Text.Encoding]::Unicode.GetBytes("Open Sesame") 
$entropy = [byte[]](1,2,3,4,5) 
$encrytpedData = [System.Security.Cryptography.ProtectedData]::Protect(` 
         $passwordBytes, $entropy, 'CurrentUser') 
$encrytpedData | Set-Content -enc byte .\password.bin 

# Retrieve and decrypted password 
$encrytpedData = Get-Content -enc byte .\password.bin 
$unencrytpedData = [System.Security.Cryptography.ProtectedData]::Unprotect(` 
         $encrytpedData, $entropy, 'CurrentUser') 
$password = [System.Text.Encoding]::Unicode.GetString($unencrytpedData) 
$password 
+0

+1 Nội dung hay; cảm ơn cho các thông tin, Keith –

8

Đến đây tìm cách lập bản đồ ổ đĩa bằng PowerShell?

Có một cách đơn giản hơn với PowerShell3.0. New-PSDrive đã được cập nhật với tùy chọn -persist. Ví dụ.

New-PSDrive -Name U -PSProvider FileSystem -Root \\yourserver\your\folder -Credential yourdomain\username -Persist 

Trước đây, New-PSDrive chỉ ảnh hưởng đến phiên PowerShell hiện tại. -persist làm cho bản đồ được đăng ký với O/S, như nó đã được. Xem New-PSDrive

Để trả lời câu hỏi ban đầu, bạn có thể thay đổi thông tin đăng nhập được sử dụng. Sử dụng -Credential để thay đổi tên miền \ tên người dùng khiến Windows nhắc mật khẩu. Một cách khác là truyền một đối tượng PSCredential như trong ví dụ dưới đây. Xem Get-Credential để biết thêm chi tiết.

PS C:\> $User = "mydomain\username" 
PS C:\> $PWord = ConvertTo-SecureString -String "mypassword" -AsPlainText -Force 
PS C:\> $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord 
PS C:\> New-PSDrive -Name U -PSProvider FileSystem -Root \\domain\some\folder -Credential $Credential -Persist 
+2

Tôi nghĩ rằng có thể có một cách dễ dàng hơn để có được các thông tin đăng nhập ngay bây giờ: '$ Credential = Get-Credential -Credential" domain \ user "'. Điều này sẽ nhắc nhập mật khẩu với trường tên người dùng đã được điền. – SeanKilleen

1
$User = "user" 
$PWord = ConvertTo-SecureString -String "password" -AsPlainText -Force 
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord 
$net = $(New-Object -ComObject WScript.Network) 
$net.MapNetworkDrive("r:", "\\server\share") 
1

tôi thấy dễ dàng lót này làm việc trong trường hợp của tôi (ít "out of the box" suy nghĩ;))

(Start-Process -FilePath "C: \ windows \ system32 \ NET.exe "-ArgumentList" SỬ DỤNG I: \ Server \ Volume/USER: XXXXX mật khẩu/persistent: yes "-Wait -Passthru) .ExitCode

Và như một phần thưởng thêm, bạn sẽ có được một lối thoát tốt đẹp để báo cáo tắt của. Hy vọng rằng sẽ giúp.

0

Trên máy trạm của tôi,

$net.MapNetworkDrive("k", "\\romeobox\files", $false, "domain\username", "password") 

gửi cho tôi lỗi:

Exception lors de l'appel de «MapNetworkDrive» avec «5» Lập luận (s): «Nôm de periph érique déjà utilisé địa phương.

Thật kỳ lạ, nó không đến từ thực tế K: đã được sử dụng nhưng thiếu "::". Dưới đây là những gì đang hoạt động trên máy trạm của tôi:

$net.MapNetworkDrive::("k", "\\romeobox\files", $false, "domain\username", "password") 
+0

Đúng, nếu bạn xem xét kỹ các ví dụ được cung cấp, bạn sẽ thấy đối số đầu tiên có dấu hai chấm đính kèm. – Vesper

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