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
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
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 $)
import-module activedirectory
(Get-ADDomain -Identity (Get-WmiObject Win32_ComputerSystem).Domain).NetBIOSName
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.
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)
Utilisez la cmdlet Active Directory Get-ADDomain:
(Get-ADDomain -Current LocalComputer).NetBIOSName
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)
}
}
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]
Le lien ci-dessus contient le fil et la conversation.