9

Tôi có một chút mã mà trông như thế này:Kiểm tra sự tồn tại của một đối tượng AD; làm cách nào để tránh thông báo lỗi xấu?

if (Get-ADUser $DN -EA SilentlyContinue) { 
    # Exists 
} else { 
    # Doesn't Exist 
} 

Thật không may, khi Get-ADUser DN thất bại trong việc tìm người dùng (trong đó là tốt, nó có nghĩa là tên đối tượng không được thực hiện), nó ném lên và phun ra một lỗi. Tôi biết nó sẽ thất bại, đó là tốt, đó là lý do tại sao tôi có một -ErrorAction đến SilentlyContinue. Thật không may nó dường như không làm gì cả ... Tôi vẫn nhận được barf trên đầu ra kịch bản. Mã hoạt động, nó chỉ là xấu xí do giao diện điều khiển phun ra lỗi.

  • Có cách nào tốt hơn để tôi kiểm tra xem một đối tượng cụ thể có tồn tại không?
  • Nếu không, có cách nào để ErrorAction hoạt động bình thường không?
+1

NB: với thử ... bắt giải pháp bạn có thể cụ thể hơn; tức là bằng cách bắt các ngoại lệ có tên. 'try {Get-ADUser $ DN -EA Stop} bắt [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {" nice try "} catch {" không phải là vấn đề mong đợi "}' – JohnLBevan

+1

'get-aduser -erroraction 'silentlycontinue'' dường như để hoạt động bình thường trong PowerShell-v4.0. –

Trả lời

1

Bạn muốn bắt ngoại trừ các đối tượng không được tìm thấy, nhưng bạn vẫn muốn thất bại cho các lý do khác như truy cập bị từ chối và như vậy, vì vậy bạn cần chỉ định ngoại lệ chính xác để bắt.

try { 
    Get-ADUser $DN -ErrorAction Stop 
    # Do stuff if found 
} catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundExce‌​ption] { 
    # Do stuff if not found 
} 

Để xác định loại ngoại lệ để đón trong trường hợp sử dụng khác, gây ra một ngoại lệ và sau đó làm:

$Error[0].Exception.GetType().FullName 

Sản lượng mà đi vào: catch [chèn ngoại lệ gõ vào đây]

2

Có vẻ như lệnh này đang phát ra lỗi kết thúc. Sử dụng try { ... } catch { ... } để xử lý/chặn lỗi.

8

Đó là một ngoại lệ, bạn chỉ có thể cố gắng nắm bắt nó như thế này:

$user = $(try {Get-ADUser $DN} catch {$null}) 
if ($user -ne $null) { 
    # Exists 
} else { 
    # Doesn't Exist 
} 
+1

Điều này hoạt động hoàn hảo. – HostBits

0

tôi sẽ làm điều này như thế này:

Get-ADUser | ?{$_.id -eq $DN.id} 

Id hoặc một số định danh duy nhất khác.

Điều này sẽ trả về người dùng hoặc không và sẽ bao gồm ngoại lệ.

+2

Đó là công trình, nhưng nó rất chậm nếu bạn thậm chí có AD vừa phải. Tìm nạp mọi đối tượng, sau đó lọc không thực tế. –

+0

Có, đây là tập hợp các vòng lặp nhỏ hơn. Trên thực tế nó là giống như dòng của Shay Levy nhưng duy nhất. –

+0

Bạn có chắc chắn điều đó không? Tôi đã theo ấn tượng rằng -Filter đã được chuyển trực tiếp trong như một truy vấn LDAP, để ngăn chặn hàng ngàn kết quả cần phải được trả về bởi máy chủ. –

16

Cách duy nhất tôi đã tìm thấy được làm việc mà không cần nhổ một lỗi là với tham số lọc:

if (Get-ADUser -Filter {distinguishedName -eq $DN}) { 
    # Exists 
} else { 
    # Doesn't Exist 
} 
+0

Làm cách nào để nhận được '-Properties *' và vẫn loại bỏ các lỗi này? –