Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如何找到域名I';我在吗?_Powershell_Powershell 2.0 - Fatal编程技术网

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)