如何找到我所在域名的简称?

时间:2014-01-22 13:22:03

标签: powershell powershell-v2.0

我想返回运行的计算机所在域的短名称。我不想要$env:USERDOMAIN因为这是用户登录的域,这可能与机器所在的域不同。如果我这样做

(gwmi win32_computersystem).Domain

这让我得到了FQDN,但我想要类似的东西返回短名称(NETBIOS名称?)。我目前正在解析FQDN,但我知道这会在以后导致错误。

我没有安装Active Directory模块,公司政策阻止我安装它,所以我不能简单地使用该模块中的(Get-ADDomain).NetBIOSName

5 个答案:

答案 0 :(得分:6)

好的,最后一次尝试。

(net config workstation) -match 'Workstation domain\s+\S+$' -replace '.+?(\S+)$','$1'

答案 1 :(得分:1)

当天晚些时候为此,但我想我会提供我的解决方案以防万一其他人偶然发现!如果你只想要域名的第一部分,那么这段代码应该有用......

$domainName = ((gwmi Win32_ComputerSystem).Domain).Split(".")[0]

答案 2 :(得分:1)

您应该能够使用几个 COM 对象在 WMI 对象 Win32_NTDomain 中没有固有延迟的情况下实现这一点 - 任何一个都应该工作:

$WinNTSystemInfo = New-Object -ComObject "WinNTSystemInfo"
$WinNTSystemInfo.GetType().InvokeMember("DomainName", "GetProperty", $null, $WinNTSystemInfo, $null)

或者替代

$ADSystemInfo = New-Object -ComObject "ADSystemInfo"
$ADSystemInfo.GetType().InvokeMember("DomainShortName", "GetProperty", $null, $ADSystemInfo, $null)

答案 3 :(得分:0)

如Ben01635所述,此命令有效。以下内容将带您进入任何领域的第一部分。 (例如,Sub.company.com将转换为“ Sub”,如果您只想获得公司部分,则可以将0更改为1,如果要com,则可以将0更改为3。)

(Get-WmiObject -Class win32_computersystem).domain.split(".")[0]

此命令通过使用(Get-WmiObject -Class win32_computersystem).domain获取Domaing,然后使用.split方法将其除以“。”来工作。字符。然后,它选择将这些字符串拆分为的数组的第一部分。如果选择0,这应该总是可以得到短路径,因为它将始终得到它遇到的第一个域部分。对于可变域来说,获得公司的中间部分并不容易,但是获得第一个“短域”形式应该很容易。如果需要在脚本中引用它,则可以继续将其分配给变量

$domainSearch = (Get-WmiObject -Class win32_computersystem).domain.split(".")[0]

如果仅搜索计算机所在的OU,则可以对计算机的OU进行类似的操作。

$searchOU = (([adsisearcher]"(&(name=$env:computername)(objectClass=computer))").findall().path).Split(",=")[3]

答案 4 :(得分:0)

虽然这很旧,但我知道这两个解决方案似乎可以可靠地工作,而无需使用AD Powershell模块即可获取域的NETBIOS名称:

选项1 -ADSI查询。取决于网络速度以进行LDAP查找,但是它并不比WMI慢很多:

$Config = $RootDSE.Get("configurationNamingContext")
$netbiosName = (new-object DirectoryServices.DirectorySearcher([adsi]"LDAP://CN=Partitions,$config",'(&(objectclass=Crossref)(netBIOSName=*))')).FindOne().Properties.nETBIOSName

选项2 -其他答案中给出的Win32_NTDomain方法的另一种形式。这样可以(希望)解决Server 2008 R2系统和受信任域上显示的空工作组的问题。

在我的示例中,实际域是MYTESTDOMAIN。服务器的站点名称在两个域中都是相同的(故意设计选择)。

> Get-WmiObject -Class Win32_NTDomain

ClientSiteName          :
DcSiteName              :
Description             : SRV101
DnsForestName           :
DomainControllerAddress :
DomainControllerName    :
DomainName              :
Roles                   :
Status                  : Unknown

ClientSiteName          : Servers
DcSiteName              : Servers
Description             : MYTESTDOMAIN
DnsForestName           : test.my.com.au
DomainControllerAddress : \\10.0.100.100
DomainControllerName    : \\MYTESTDC003
DomainName              : MYTESTDOMAIN
Roles                   :
Status                  : OK

ClientSiteName          : Servers
DcSiteName              : Servers
Description             : MYDOMAIN
DnsForestName           : my.com.au
DomainControllerAddress : \\10.10.100.100
DomainControllerName    : \\MYDC001
DomainName              : MYDOMAIN
Roles                   :
Status                  : OK

Win32_ComputerSystem给出了计算机的域名DNS名称-至少在我所有的测试中,这都是唯一的。

> gwmi Win32_ComputerSystem

Domain              : test.my.com.au
Manufacturer        : VMware, Inc.
Model               : VMware Virtual Platform
Name                : SRV101
PrimaryOwnerName    : ICT
TotalPhysicalMemory : 12884430848

我们可以将它们组合成一个不错的WMI查询,该查询只会返回与Win32_ComputerSystem域匹配的域的结果

> Get-WmiObject -Query "SELECT * FROM Win32_NTDomain WHERE DomainName LIKE '%' AND DNSForestName = `'$((gwmi win32_computersystem).domain)`'"

ClientSiteName          : Servers
DcSiteName              : Servers
Description             : MYTESTDOMAIN
DnsForestName           : test.my.com.au
DomainControllerAddress : \\10.0.100.100
DomainControllerName    : \\MYTESTDC003
DomainName              : MYTESTDOMAIN
Roles                   :
Status                  : OK

将其包装在一个仅返回NETBIOS名称的漂亮的单行代码中:

$netbiosName = (Get-WmiObject -Query "SELECT DomainName FROM Win32_NTDomain WHERE DomainName LIKE '%' AND DNSForestName = `'$((gwmi win32_computersystem).domain)`'").DomainName

显然应该对其进行测试,但是在我所有的测试中都可以使用它-尽管只有一个信任关系的域。