Els*_*mer 14 sql-server powershell smo
我的任务是发现在我们的域中运行的所有 SQL Server 实例。在某些情况下,每个服务器有多个实例。我见过两种不同的 PowerShell 方法来查找这些实例,但似乎都没有找到所有实例。
1) 使用 WMI
$srvr = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $computerName
$instances = $srvr | ForEach-Object {$_.ServerInstances} | Select @{Name="fullName";Expression={$computerName +"\"+ $_.Name}}
return $instances
Run Code Online (Sandbox Code Playgroud)
2)使用远程注册表(与 Get-SQLInstance 1 一样)
我遇到的最大问题是,并非我所知道的所有服务器都使用 SQL Server WMI 提供程序运行,也不是所有服务器都允许远程注册。有没有第三种方法?我可以使用远程桌面访问所有服务器,但我正在查看大约 30 台机器,并希望尽可能避免手动步骤。这仅需要适用于 SQL Server 2008 及更高版本,虽然了解其他 SQL Server 服务 (SSIS/SSAS/SSRS) 会很好,但我主要关注 SQL Server 本身。
小智 12
如果你想要一些对未来有用的东西,我可能会避免尝试搜索注册表。多年来,SQL Server 的配置单元发生了一些变化,要跟上它可能会很麻烦。
使用 的方法SqlDataSourceEnumerator
有时很不稳定,虽然我会使用它,但并不是实例在网络上的具体证据。我相信它也取决于 SQL 浏览器服务,大多数时候我发现它被禁用。
我将使用 WMI 类win32_Service
。我使用它是因为它比Get-Service
cmdlet提供了更多关于服务的信息。
我通常将所有内容都写为函数,因为您可以使用它来实际执行日常检查或验证服务以进行故障排除。
function Get-ServiceStatus ([string[]]$server)
{
foreach ($s in $server)
{
if(Test-Connection $s -Count 2 -Quiet)
{
Get-WmiObject win32_Service -Computer $s |
where {$_.DisplayName -match "SQL Server"} |
select SystemName, DisplayName, Name, State, Status, StartMode, StartName
}
}
}
Run Code Online (Sandbox Code Playgroud)
这比我通常使用的要多一些,但以防万一其他人遇到并想要使用它。在Test-Connection
以相当于ping myserver
在DOS提示符和-Quiet
标志只是简单地拥有它返回true
或false
。这将默认为 4 ping,因此设置-Count 2
只会使它执行两次。
该变量[string[]]$server
是一种用于声明$server
将接受服务器名称数组的方法。因此,此函数的示例调用可能如下所示:
Get-ServiceStatus -server (Get-Content C:\temp\MyServerList.txt)
Run Code Online (Sandbox Code Playgroud)
或者
$servers = 'MyServer1','MyServer2','MyServer3'
Get-ServiceStatus -server $servers
Run Code Online (Sandbox Code Playgroud)
编辑
注意到的评论是以上确实取决于所提供的服务器列表。如果我没有提供该列表,您还有其他一些选择。
如果我在 Active Directory 环境中,我可以使用PowerShell 中的ActiveDirectory模块通过 cmdlet 拉出域中所有服务器的列表Get-ADComputer
。警告的话,请确保您-Filter
在大型域上使用良好的。
我还简单地对网络进行了 IP 扫描(经批准),该网络为我提供了发现打开端口 1433 的 IP 地址。我将获取该 IP 列表并利用它Get-ADComputer
来查找域计算机名称,然后将其传递到上面的函数中
例子:
Import-Module ActiveDirectory
$sList = $ipList | Select -ExpandProperty IP
$results = foreach ($i in $sList) {
Get-ADComputer -Filter 'IPv4Address -eq $i' -Properties * | Select Name}
Get-ServiceStatus -server $results
Run Code Online (Sandbox Code Playgroud)
编辑
建议使用Write-Verbose
并添加到 try/catch 块中的编辑,虽然这可能很有用,并且在大多数情况下是代码实践,但我会将其留给想要使用此功能添加额外代码或功能的人。只是想提供一个基本的例子来继续。我确实将SystemName
属性添加到输出中以包含实际的服务器名称返回信息,在其他函数上执行此操作只是通常不要一次将它用于多个服务器,所以我忘记了。
我所知道的在不知道所有可能拥有的服务器及其特定名称的情况下在环境中发现实例的唯一方法是调用System.Data.Sql.SqlDataSourceEnumerator.GetDataSources()。 不过,这种方法带有很多脚注。这是直接从该 MSDN 资源中提取的片段:
由于 SqlDataSourceEnumerator 用于在网络上定位数据源的机制的性质,该方法不会总是返回 可用服务器的完整列表,并且每次调用时该列表可能都不相同。如果您打算使用此功能让用户从列表中选择服务器,请确保您始终还提供一个选项来键入不在列表中的名称,以防服务器枚举未返回所有可用服务器. 此外, 此方法可能需要大量时间来执行,因此在性能至关重要时调用它时要小心。
来自 PowerShell 的调用很简单:
[System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources()
Run Code Online (Sandbox Code Playgroud)
该方法返回一个DataTable
您可以相应处理的对象。
归档时间: |
|
查看次数: |
43387 次 |
最近记录: |