Powershell 如何找到域名I';我在吗?
我想返回我正在运行的计算机所在域的短名称。我不想要Powershell 如何找到域名I';我在吗?,powershell,powershell-2.0,Powershell,Powershell 2.0,我想返回我正在运行的计算机所在域的短名称。我不想要$env:USERDOMAIN,因为这是用户登录的域,可能与计算机所在的域不同。如果我这样做 (gwmi win32_computersystem).Domain 这将获得FQDN,但我希望类似的内容返回短名称(NETBIOS名称?)。我目前正在解析FQDN,但我知道这将导致以后出现错误 我没有安装Active Directory模块,并且公司策略阻止我安装它,因此我不能简单地使用该模块中的(Get ADDomain).NetBIOSName。好
$env:USERDOMAIN
,因为这是用户登录的域,可能与计算机所在的域不同。如果我这样做
(gwmi win32_computersystem).Domain
这将获得FQDN,但我希望类似的内容返回短名称(NETBIOS名称?)。我目前正在解析FQDN,但我知道这将导致以后出现错误
我没有安装Active Directory模块,并且公司策略阻止我安装它,因此我不能简单地使用该模块中的(Get ADDomain).NetBIOSName
。好的,最后一次尝试
(net config workstation) -match 'Workstation domain\s+\S+$' -replace '.+?(\S+)$','$1'
这一天有点晚了,但我想我会提供我的解决方案,以防其他人偶然发现这一点!如果你只是想要域名的第一部分,那么这个代码应该可以工作
$domainName = ((gwmi Win32_ComputerSystem).Domain).Split(".")[0]
如Ben01635所述,该命令有效。以下内容将为您获取任何域的第一部分。 (例如,Sub.company.com将转换为“Sub”,如果您只想获得公司部分,您可以将0更改为1,如果您想要com,您可以将0更改为3。) 此命令的工作方式是使用(Get WMIOObject-Class win32_computersystem).domain获取域,然后使用.split方法将其按“.”字符分割。然后,它选择这些字符串拆分成的数组的第一部分。如果您选择0,这将始终用于获取短路径,因为它将始终获取它遇到的第一个域部分。对于可变域来说,获取中间公司部分并不容易,但是获取第一个短域表单应该非常容易。如果需要在脚本中引用变量,则可以继续将其分配给变量
$domainSearch = (Get-WmiObject -Class win32_computersystem).domain.split(".")[0]
如果只搜索计算机所在的OU,则可以对计算机的OU执行类似的操作
$searchOU = (([adsisearcher]"(&(name=$env:computername)(objectClass=computer))").findall().path).Split(",=")[3]
虽然这已经过时,但我知道有两种解决方案可以可靠地获得域的NETBIOS名称,而无需使用AD Powershell模块: 选项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\u NTDomain
方法的另一个变体。这(希望)解决了Server2008R2系统和受信任域上显示的空工作组的问题
在我的示例中,实际的域是MYTESTDOMAIN。服务器的站点名称在两个域中相同(经过深思熟虑的设计选择)
Win32\u 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\u 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
显然,它应该被测试,但它在我的所有测试中都有效-尽管只有一个信任域。您应该能够使用两个COM对象实现这一点,而不会有WMI对象Win32\n域中固有的延迟-任何一个都可以工作:
$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)
@Kayasax的可能副本看到了该页面,但没有解决问题。
(gwmi Win32\u NTDomain)。域名
似乎起到了作用……不,没有,我返回了四个域。只是在一些Windows 2008 R2服务器上尝试了这一点,我得到了$null
输出。在我的Windows 2012 R2服务器上,正确的域是第一个域。幸运的是@mjolinor提供了货物!因为这是给用户的。我对用户不感兴趣,我想要机器域。好的。留下了一个不同的答案。这是FQDN,我想要短名称。这是错误的。域名短名称在点之前并不总是第一部分。例如,您可以拥有corpo.example.com的域名fqdn,域名缩写为CORP。我意识到这是旧的,但您的答案不正确。原始q需要域的Netbios名称-您的解决方案只返回域名DNS名称的第一部分。
$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)