2011-04-27 22 views
15

Làm cách nào để có được tên miền NetBIOS (aka 'short') của máy tính hiện tại từ PowerShell?Miền NetBIOS của máy tính trong PowerShell

$ ENV: USERDOMAIN hiển thị miền của người dùng hiện tại, nhưng tôi muốn miền mà máy hiện tại là thành viên.

Tôi đã phát hiện ra bạn có thể làm điều đó pretty easily in VBScript, nhưng rõ ràng là ADSystemInfo isn't very nice to use trong PowerShell.

Cập nhật

Đây là giải pháp cuối cùng của tôi kết hợp các gợi ý của việc sử dụng Win32_NTDomain, nhưng lọc vào miền máy hiện tại của

$wmiDomain = Get-WmiObject Win32_NTDomain -Filter "DnsForestName = '$((Get-WmiObject Win32_ComputerSystem).Domain)'" 
$domain = $wmiDomain.DomainName 

Trả lời

17

Trong hầu hết các trường hợp, tên miền NetBIOS mặc định là nhãn ngoài cùng bên trái trong miền DNS n ame lên đến 15 byte đầu tiên (tên NetBIOS có giới hạn là 15 byte). Tên miền NetBIOS có thể thay đổi trong khi cài đặt Thư mục Họat động, nhưng không thể thay đổi.

Các Win32_ComputerSystem WMI đối tượng đưa ra thông tin trên máy tính Windows

PS C:\> Get-WmiObject Win32_ComputerSystem 

Domain    : WORKGROUP 
Manufacturer  : Hewlett-Packard 
Model    : HP EliteBook 8530w (XXXXXXXXX) 
Name    : ABCHPP2 
PrimaryOwnerName : ABC 
TotalPhysicalMemory : 4190388224 

Vì vậy, các Tên miền được cho bởi:

PS C:\> (gwmi WIN32_ComputerSystem).Domain 

Nhưng trong cài đặt tên miền, tên DNS được đưa ra. Trong trường hợp này, bạn có thể sử dụng lệnh nbtstat -n để tìm tên miền NetBIOS được hiển thị như thế này <DOMAIN><1B>.

Các PowerShell lệnh có thể là:

nbtstat -n | Select-String -Pattern "^ *(.*) *<1B>.*$" | % {$_ -replace '^ *(.*) *<1B>.*$','$1'} 

Đây là một cách khác để sử dụng WMI

PS C:\> (gwmi Win32_NTDomain).DomainName 
+0

Tôi đã cố gắng tiếp cận đó và nó không hoạt động. Thuộc tính 'Miền' không phải là tên ngắn/NetBIOS mà tôi theo sau. Có chứa tên miền AD đầy đủ –

+0

Bạn hoàn toàn đúng, vì vậy tôi đã chỉnh sửa câu trả lời của mình. – JPBlanc

+0

Tôi đã thử điều này và cho tôi nó hiển thị là <1E> (chứ không phải là <1B>) –

2

Từ Here

# Retrieve Distinguished Name of current domain. 
$Domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() 
$Root = $Domain.GetDirectoryEntry() 
$Base = ($Root.distinguishedName) 

# Use the NameTranslate object. 
$objTrans = New-Object -comObject "NameTranslate" 
$objNT = $objTrans.GetType() 

# Invoke the Init method to Initialize NameTranslate by locating 
# the Global Catalog. Note the constant 3 is ADS_NAME_INITTYPE_GC. 
$objNT.InvokeMember("Init", "InvokeMethod", $Null, $objTrans, (3, $Null)) 

# Use the Set method to specify the Distinguished Name of the current domain. 
# Note the constant 1 is ADS_NAME_TYPE_1779. 
$objNT.InvokeMember("Set", "InvokeMethod", $Null, $objTrans, (1, "$Base")) 

# Use the Get method to retrieve the NetBIOS name of the current domain. 
# Note the constant 3 is ADS_NAME_TYPE_NT4. 
# The value retrieved includes a trailing backslash. 
$strDomain = $objNT.InvokeMember("Get", "InvokeMethod", $Null, $objTrans, 3) 
4
import-module activedirectory 
(Get-ADDomain -Identity (Get-WmiObject Win32_ComputerSystem).Domain).NetBIOSName 
3

OP là sau khi "miền máy tính" để câu trả lời sẽ là $GetComputerDomain (dưới đây) nhưng Tôi cũng sẽ thêm $ GetUserDomain để tham khảo.

$GetComputerDomain = ([System.DirectoryServices.ActiveDirectory.Domain]::GetComputerDomain()).Name 
$GetUserDomain = ([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()).Name 

Tôi tìm tùy chọn wmi (gwmi) cực kỳ chậm, đặc biệt khi bạn truy vấn lớp Win32_NTDomain. Tôi có một môi trường miền đa tin cậy và sẽ mất mãi mãi khi tôi chỉ cần thông tin đơn giản đó nhanh chóng.

+1

Xin lỗi, đó không phải là kết quả tôi đã làm sau đó. Cả hai đều trả về một tên miền kiểu DNS đầy đủ. Tôi đã theo tên miền ngắn/kiểu NetBIOS. –

8

Sử dụng env: để có được thiết lập môi trường thông qua PowerShell

NetBIOS: $ env: UserDomain FQDN: $ env: userdnsdomain

Để xem tất cả các giá trị:

dir env: (không có $)

+1

Câu trả lời đó đã được đề cập trong câu hỏi của tôi. Nó không trả lại tên miền của máy tính mặc dù (đó là những gì tôi đã yêu cầu) –

+0

Có 'USERDOMAIN' và' USERDNSDOMAIN'. Việc thứ hai đã làm công việc cho nhiệm vụ của tôi. – Andreas

+0

Cảm ơn! Đây là câu trả lời tôi đang tìm kiếm. – lesca

0

Lệnh powershell dưới đây hoạt động tuyệt vời! Tôi đã thử nghiệm sau khi thử các giải pháp khác nhau.

Nếu bạn sử dụng lệnh Net sau:

[System.Net.Dns]::GetHostByAddress('192.168.1.101').hostname 

Nó hoạt động quá, nhưng nó được sử dụng DNS để giải quyết, trong trường hợp của tôi, chúng tôi có WINS thiết lập để hỗ trợ một ứng dụng mà đòi hỏi nó, vì vậy có thể không sử dụng nó. Dưới đây là những gì tôi đã kết thúc sử dụng như một phần của một kịch bản tôi sử dụng để kiểm tra đăng ký WINS cho mỗi khách hàng:

$IPAddress = "<enterIPAddress>" (remove brackets, just enter IP address) 

(nbtstat -A $IPAddress | ?{$_ -match '\<00\> UNIQUE'}).Split()[4] 

http://social.technet.microsoft.com/Forums/en-US/f52eb2c7-d55d-4d31-ab4e-09d65d366771/how-to-process-cmd-nbtstat-a-ipaddress-output-and-display-the-computer-name-in-powershell?forum=ITCG

Liên kết ở trên có các chủ đề và nói chuyện.

1

Sử dụng Active Directory Cmdlet Get-ADDomain:

(Get-ADDomain -Current LocalComputer).NetBIOSName 
+0

Có vẻ như một biến thể trên câu trả lời của @ Sacha –

+0

Vâng, nó cũng tương tự. Tôi chỉ có ít tổ hợp phím hơn :) – Jez

+0

Ha! Vâng, tôi đoán đó là sự thật rằng bạn chỉ có một số giới hạn của những người sử dụng lên http://keysleft.com/ :-) –

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