我想返回运行的计算机所在域的短名称。我不想要$env:USERDOMAIN
因为这是用户登录的域,这可能与机器所在的域不同。如果我这样做
(gwmi win32_computersystem).Domain
这让我得到了FQDN,但我想要类似的东西返回短名称(NETBIOS名称?)。我目前正在解析FQDN,但我知道这会在以后导致错误。
我没有安装Active Directory模块,公司政策阻止我安装它,所以我不能简单地使用该模块中的(Get-ADDomain).NetBIOSName
。
答案 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
显然应该对其进行测试,但是在我所有的测试中都可以使用它-尽管只有一个信任关系的域。