web-dev-qa-db-fra.com

Domaine NetBIOS de l'ordinateur dans PowerShell

Comment puis-je obtenir le nom de domaine NetBIOS (autrement dit "court") de l'ordinateur actuel auprès de PowerShell?

$ ENV: USERDOMAIN affiche le domaine de l'utilisateur actuel, mais je veux le domaine dont la machine actuelle est membre.

J'ai découvert que vous pouvez le faire assez facilement dans VBScript , mais apparemment ADSystemInfo n'est pas très agréable à utiliser dans PowerShell.

Mettre à jour

Voici ma solution finale intégrant la suggestion d'utiliser Win32_NTDomain , mais en filtrant le domaine de la machine actuelle

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

Dans la plupart des cas, le nom de domaine NetBIOS par défaut est l’étiquette la plus à gauche dans le nom de domaine DNS jusqu’aux 15 premiers octets (les noms NetBIOS sont limités à 15 octets) .. Active Directory, mais cela ne peut pas être changé. 

L'objet WMI WIN32_ComputerSystem donne des informations sur un ordinateur Windows

PS C:\> Get-WmiObject Win32_ComputerSystem

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

Donc le nom de domaine est donné par:

PS C:\> (gwmi WIN32_ComputerSystem).Domain

Mais dans l'installation de domaine, le nom DNS est donné. Dans ce cas, vous pouvez utiliser la commande nbtstat -n pour rechercher le nom de domaine NetBIOS affiché comme suit: <DOMAIN><1B>.

La commande PowerShell peut être:

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

Voici un autre moyen d'utiliser WMI

PS C:\> (gwmi Win32_NTDomain).DomainName
17
JPBlanc

Utilisez env: pour obtenir les paramètres d'environnement via PowerShell

NetBIOS: $env:userdomain

Nom de domaine complet: $env:userdnsdomain

Pour voir toutes les valeurs:

dir env:  (no $)
8
user2027763
import-module activedirectory
(Get-ADDomain -Identity (Get-WmiObject Win32_ComputerSystem).Domain).NetBIOSName
4
Sascha P.

OP est après "domaine informatique" donc la réponse serait $GetComputerDomain (ci-dessous) mais je vais ajouter le $ GetUserDomain également à titre de référence.

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

Je trouve l’option wmi (gwmi) extrêmement lente, en particulier lorsque vous interrogez la classe Win32_NTDomain. J'ai un environnement de domaine multi-confiance et cela prend une éternité lorsque j'ai juste besoin de cette information simple et rapide. 

3

De ici

# 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)
2
Mike Shepard

Utilisez la cmdlet Active Directory Get-ADDomain:

(Get-ADDomain -Current LocalComputer).NetBIOSName
1
Jez

Utiliser NetGetJoinInformation et 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
Bill_Stewart

La commande en dessous de powershell fonctionne très bien! J'ai testé après avoir essayé diverses solutions.

Si vous utilisez la commande .Net suivante:

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

Cela fonctionne aussi, mais il utilise DNS pour résoudre le problème. Dans mon cas, nous avons la configuration de WINS pour prendre en charge une application qui en a besoin, nous ne pouvons donc pas l'utiliser. Voici ce que j’ai fini par utiliser dans le cadre d’un script permettant de vérifier l’enregistrement de WINS pour chaque client:

$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- le nom de l'ordinateur dans PowerShell? forum = ITCG

Le lien ci-dessus contient le fil et la conversation.

0
ez4sheezee