2012-05-29 19 views
9

Giả sử tôi có một đối tượng PSCrendential trong PowerShell mà tôi đã tạo bằng cách sử dụng Get-Credential.Xác thực PowerShell PSCredential

Làm cách nào để xác thực đầu vào đối với Active Directory?

Bởi bây giờ tôi tìm thấy con đường này, nhưng tôi cảm thấy đó là một chút xấu xí:

[void][System.Reflection.Assembly]::LoadWithPartialName("System.DirectoryServices.AccountManagement") 


function Validate-Credentials([System.Management.Automation.PSCredential]$credentials) 
{ 
    $pctx = New-Object System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::Domain, "domain") 
    $nc = $credentials.GetNetworkCredential() 
    return $pctx.ValidateCredentials($nc.UserName, $nc.Password) 
} 

$credentials = Get-Credential 

Validate-Credentials $credentials 

[Chỉnh sửa, hai năm sau] Đối với độc giả trong tương lai, xin lưu ý rằng Test-Credential hoặc Test-PSCredential là những cái tên tốt hơn, bởi vì Validate không phải là một động từ PowerShell hợp lệ (xem Get-Verb)

Trả lời

8

tôi tin rằng sử dụng System.DirectoryServices.AccountManagement là cách ít xấu xí:

Điều này đang sử dụng ADSI (xấu xí hơn?):

$cred = Get-Credential #Read credentials 
$username = $cred.username 
$password = $cred.GetNetworkCredential().password 

# Get current domain using logged-on user's credentials 
$CurrentDomain = "LDAP://" + ([ADSI]"").distinguishedName 
$domain = New-Object System.DirectoryServices.DirectoryEntry($CurrentDomain,$UserName,$Password) 

if ($domain.name -eq $null) 
{ 
write-host "Authentication failed - please verify your username and password." 
exit #terminate the script. 
} 
else 
{ 
write-host "Successfully authenticated with domain $domain.name" 
} 
+0

Tôi hiểu rằng PSCredentials là nhà cung cấp chứng thực bất khả tri (đó là cơ bản một container đơn giản cho tên người dùng/mật khẩu), nhưng yêu cầu này âm thanh rất phổ biến đối với tôi. –

+0

@SteveB Đó là một nhiệm vụ thực sự phổ biến cho sysadmin và developper đặc biệt là đối với những người làm việc trong AD đó là lý do tại sao (IMO) microsoft làm AccountManagement. Ở đây bạn có thể thấy nhiều cách khác nhau được sử dụng trong C# để thực hiện tác vụ này: http://stackoverflow.com/questions/290548/c-sharp-validate-a-username-and-password-against-active-directory –

+0

Thực tế , các phương pháp hay nhất về phát triển chung áp dụng ở đây. Đặc biệt tôi có thể che giấu sự phức tạp trong chức năng này và sau đó chỉ cần gọi hàm :) –

0

Tôi gặp sự cố tương tự với trình cài đặt và yêu cầu xác minh chi tiết tài khoản dịch vụ được cung cấp. Tôi muốn tránh sử dụng các mô-đun AD trong Powershell như tôi đã không được 100% này sẽ được cài đặt trên máy chạy kịch bản.

Tôi đã làm thử nghiệm bằng cách sử dụng bên dưới, nó hơi bẩn nhưng nó hoạt động.

try{ 
    start-process -Credential $c -FilePath ping -WindowStyle Hidden 
} catch { 
    write-error $_.Exception.Message 
    break 
} 
+1

Cả câu hỏi của tôi lẫn @cb. câu trả lời yêu cầu phải tải mô-đun AD. Nó thực sự dựa vào một số lớp .Net liên quan đến AD, luôn có sẵn trong PowerShell. –

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