NetBIOS домен компьютера в PowerShell - PullRequest
15 голосов
/ 27 апреля 2011

Как я могу получить NetBIOS (также короткое) доменное имя текущего компьютера из PowerShell?

$ ENV: USERDOMAIN отображает домен текущего пользователя, но я хочу, чтобы домен был текущиммашина является членом.

Я обнаружил, что вы можете сделать это довольно легко в VBScript , но, очевидно, ADSystemInfo не очень хорошо использовать в PowerShell.

Обновление

Вот мое окончательное решение, включающее предложение использовать Win32_NTDomain , но с фильтрацией в домен текущего компьютера

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

Ответы [ 8 ]

18 голосов
/ 27 апреля 2011

В большинстве случаев имя домена NetBIOS по умолчанию является самой левой меткой в ​​имени домена DNS вплоть до первых 15 байтов (для имен NetBIOS существует ограничение в 15 байтов).Имя домена NetBIOS может быть изменено во время установки Active Directory, но его нельзя изменить.

Объект WMI WIN32_ComputerSystem предоставляет информацию о компьютере под управлением Windows

PS C:\> Get-WmiObject Win32_ComputerSystem

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

Таким образом, имя домена задается следующим образом:

PS C:\> (gwmi WIN32_ComputerSystem).Domain

Но при установке домена имя DNSдано.В этом случае вы можете использовать команду nbtstat -n, чтобы найти имя домена NetBIOS, которое отображается следующим образом <DOMAIN><1B>.

Команда PowerShell может быть:

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

Вот еще односпособ с использованием WMI

PS C:\> (gwmi Win32_NTDomain).DomainName
9 голосов
/ 31 января 2013

Используйте env: для получения настроек среды через PowerShell

NetBIOS: $env:userdomain

FQDN: $env:userdnsdomain

Чтобы просмотреть все значения:

dir env:  (no $)
4 голосов
/ 20 октября 2011
import-module activedirectory
(Get-ADDomain -Identity (Get-WmiObject Win32_ComputerSystem).Domain).NetBIOSName
3 голосов
/ 25 мая 2012

OP - после "домена компьютера", поэтому ответ будет $GetComputerDomain (ниже), но я добавлю $ GetUserDomain также для справки.

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

Я считаю, что опция wmi (gwmi) очень медленная, особенно когда вы запрашиваете класс Win32_NTDomain. У меня много доверенная доменная среда, и это занимает вечно, когда мне просто нужна эта простая информация быстро.

2 голосов
/ 27 апреля 2011

С Здесь

# 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)
1 голос
/ 03 сентября 2015

Использование командлета Active Directory Get-ADDomain:

(Get-ADDomain -Current LocalComputer).NetBIOSName
0 голосов
/ 02 мая 2018

Использование NetGetJoinInformation и P / Invoke:

Add-Type -MemberDefinition @"
[DllImport("netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern uint NetApiBufferFree(IntPtr Buffer);
[DllImport("netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern int NetGetJoinInformation(
  string server,
  out IntPtr NameBuffer,
  out int BufferType);
"@ -Namespace Win32Api -Name NetApi32

function GetDomainName {
  $pNameBuffer = [IntPtr]::Zero
  $joinStatus = 0
  $apiResult = [Win32Api.NetApi32]::NetGetJoinInformation(
    $null,               # lpServer
    [Ref] $pNameBuffer,  # lpNameBuffer
    [Ref] $joinStatus    # BufferType
  )
  if ( $apiResult -eq 0 ) {
    [Runtime.InteropServices.Marshal]::PtrToStringAuto($pNameBuffer)
    [Void] [Win32Api.NetApi32]::NetApiBufferFree($pNameBuffer)
  }
}
0 голосов
/ 24 мая 2014

Следующая команда powershell отлично работает! Я проверил после попытки различных решений.

Если вы используете следующую команду .Net:

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

Это тоже работает, но для разрешения используется DNS, в моем случае мы настроили WINS для поддержки приложения, которое требует его, поэтому не может его использовать. Ниже приведено описание того, что я использовал как часть скрипта, который я использую для проверки регистрации WINS для каждого клиента:

$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

Приведенная выше ссылка содержит тему и диалог.

...