我不知道确切的Windows / SQL Server术语,所以我可能说的话与实际的技术术语有些不同。请原谅。
我使用Windows凭据连接到主机,我知道这是SQL Server。 有没有办法使用Power Shell / bash查找该主机是群集的一部分还是仅是独立服务器?
例如,有两个节点NODE_1和NODE_2组成一个集群,并有4个名为host_1,host_2,host_3,host_4的主机。所有这些主机都是SQL-服务器。当我使用Windows凭据连接到这些主机中的任何一个并在bash上运行主机名时,都会收到(NODE_1&NODE_2)。
我尝试使用power-shell(在host_1-> NODE_1上),但始终显示主机未群集:
$server = hostname; # Tried commenting this line. $server still gets 'NODE_1'
$s=Get-WMIObject -query "select * from Win32_ComputerSystem" -ComputerName $server | select name
if ($s.Name -ne $server) {
#if ($s -ne $server) {
Write-Output "$server is clustered"
} else {
Write-Output "$server is not clustered"
}
我认为这是因为我正在将节点名称'NODE_1'分配给$ server而不是'host_1'。但是我找不到使用power-shell获取“ host_1”的方法。
我尝试过的操作:手动将$ server替换为“ host_1”会得到正确的结果。但是由于此脚本将成为较大的程序的一部分,该程序将在数百个具有不同版本的SQL服务器上运行,所以我无法手动提供实际的主机名作为字符串。因此,我试图找到一种使用power-shell进行此操作的方法。
我也尝试过使用这些选项来获取“ host_1”,但它们都返回“ NODE_1”。
PS SQLSERVER:\> $Env:Computername
NODE_1
PS SQLSERVER:\> hostname.exe
NODE_1
PS SQLSERVER:\> [System.Net.Dns]::GetHostName()
NODE_1
PS SQLSERVER:\> $env:COMPUTERNAME
NODE_1
用SQL术语可以将host_1,host_2,host_3,host_4称为侦听器?
问题:是否可以使用Power-shell将“ host_1”分配给$ server而不是“ NODE_1”?
如果使用Windows / SQL凭据建立连接后还有另一种方法可以做到这一点,那么我肯定会尝试一下。
我唯一的限制是我不知道主机是群集的(因此具有多个数据库实例)还是独立的。因此,如果我尝试与实例建立连接但我的连接字符串没有“ $ server = host-name \ instance”,则使用SQL凭据可能会失败
答案 0 :(得分:0)
尝试此操作,$ HostName可以是群集名称或节点之一的名称。可以使用硬编码代替该示例中使用的变量。
$services = Get-WmiObject -class Win32_SystemServices -computername $HostName
foreach ($service in $services.partcomponent) { if ($service -match 'ClusSvc') { 'Clustered' }}