我今天需要你的PowerShell帮助。我有一个SQL Server实例(在名为VMDEV-APP11
的服务器上)配置为中央管理服务器(CMS),我在其中注册了所有我的Dev / Test / Prod SQL实例,我想使用PowerShell来读取SQL来自我所有服务器的服务器错误日志我有一个查询,它检索我的所有SQL Server实例,但当我将其输出传递给ReadErrorLog
的调用时,我收到一个错误。
这是检索我在CMS上注册的SQL Server实例列表的代码(请注意我排除了我的SQL Server 2000实例):
Set-Location D:\MSSQL11.MSSQLSERVER\CMS
# Define functions to query SQL Server and write data to a SQL table
. ./invoke-sqlcmd2.ps1
. ./write-datatable.ps1
Invoke-sqlcmd2 -ServerInstance "VMDEV-APP11" -Database dba -Query "select s.server_name from msdb.dbo.sysmanagement_shared_registered_servers s, msdb.dbo.sysmanagement_shared_server_groups g where s.server_group_id = g.server_group_id and g.name not like '2000%'"
server_name
-----------
INF-SRV14
VMDEV-APP15
NEX-SRV48
...
这就是我认为可行的以及我实际得到的错误:
Invoke-sqlcmd2 -ServerInstance "VMDEV-APP11" -Database dba -Query "select s.server_name from msdb.dbo.sysmanagement_shared_registered_servers s, msdb.dbo.sysmanagement_shared_server_groups g where s.server_group_id = g.server_group_id and g.name not like '2000%'" | foreach-object { $_.server_name.ReadErrorLog() }
错误:
方法调用失败,因为[System.String]不包含名为“ReadErrorLog”的方法 在D:\ MSSQL11.MSSQLSERVER \ CMS \ db_errorlog.ps1:38 char:284
+ ... reach-object {$ _.server_name.ReadErrorLog()}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidOperation:(:) [],RuntimeException
+ FullyQualifiedErrorId:MethodNotFound
我怀疑我需要将我的查询返回的字符串转换为另一种类型的对象(可能是服务器名称?),以便ReadErrorLog()
调用工作,但我不知道该怎么做。
有什么建议吗?
非常感谢任何帮助。
肯
答案 0 :(得分:0)
您尝试在ReadErrorLog()
列值上调用DataRow
方法,这是一个字符串。
你需要做的是这样的事情:
Import-Module sqlps -DisableNameChecking
Invoke-sqlcmd2 -ServerInstance "VMDEV-APP11" -Database dba -Query "select s.server_name from msdb.dbo.sysmanagement_shared_registered_servers s, msdb.dbo.sysmanagement_shared_server_groups g where s.server_group_id = g.server_group_id and g.name not like '2000%'" | `
foreach-object {
$server = $_.server_name
$logs = (get-item SQLSERVER:\sql\$server\default).ReadErrorLog()
# $logs is a DataTable so you can iterate the rows however you wish
}
假设您的所有服务器都是默认实例,否则您可能需要更多地针对特定实例进行操作。
答案 1 :(得分:0)
我在SQL Central Management服务器上运行的代码是:
$logs = 0..6 | % { (get-item SQLSERVER:\sql\<servername>\default).ReadErrorLog($_) }
最初,我通过将运行PowerShell代码的服务帐户添加到本地管理员 Windows组 AND 并使用 sysadmin创建SQL登录来实现此目的远程SQL Server主机上的权限。不出所料,我的安保人员遇到了这个问题。我最初尝试减少访问权限导致以下错误:
WARNING: Could not obtain SQL Server Service information. An attempt to connect
to WMI on 'NEX-SRV1' failed with the following error: SQL Server WMI provider
is not available on NEX-SRV1. --> Invalid namespace
经过相当多的愚弄,我认为是读取SQL错误日志所需的最低安全性。在运行SQL Server数据库的远程服务器上执行以下授权:
本地Windows组
<强> WMIMgmt.msc 强>
使用所有安全选项将服务帐户添加到以下每个分支机构中除了&#34;编辑安全性&#34;
SQL Server
完成这些更改后,我可以从中央位置监控SQL错误日志,而无需授予疯狂级别的服务帐户访问权限。