我有數百臺服務器,並希望檢查是否存在運行在其上的非系統SQL Server數據庫。它們可能有多種版本:2005,2008,2012,Express。如何在不登錄的情況下獲取SQL Server數據庫名稱?
我不確定數據庫名稱是否存儲在特定的註冊表(雖然我找不到它)或文件/文件名(在C:驅動器上),並可以通過這種方式獲取信息。如果可能的話,我希望能夠通過Powershell腳本完成此操作,但是我可以將其批入批處理中。
我有數百臺服務器,並希望檢查是否存在運行在其上的非系統SQL Server數據庫。它們可能有多種版本:2005,2008,2012,Express。如何在不登錄的情況下獲取SQL Server數據庫名稱?
我不確定數據庫名稱是否存儲在特定的註冊表(雖然我找不到它)或文件/文件名(在C:驅動器上),並可以通過這種方式獲取信息。如果可能的話,我希望能夠通過Powershell腳本完成此操作,但是我可以將其批入批處理中。
假設您有權這樣做,T-SQL和使用SQL Server管理對象(SMO)可能是您最好的選擇。有關運行T-SQL或使用PowerShell中的SMO,including this one的參考資料比比皆是。
示例使用T-SQL
# Download and dot source Invoke-Sqlcmd2
# source - https://raw.githubusercontent.com/RamblingCookieMonster/PowerShell/master/Invoke-Sqlcmd2.ps1
. "\\Path\To\Invoke-Sqlcmd2.ps1"
#Run sp_databases, among other options, against your SQL servers.
"Server1", "Server2\NamedInstance" |
Invoke-Sqlcmd2 -query "Sp_databases" -AppendServerInstance
示例使用SQL SMO
#Download, install components from SQL feature pack:
# SQLSysClrTypes, SharedManagementObjects, optionally PowerShellTools
# http://www.microsoft.com/en-us/download/details.aspx?id=42295
#One of several ways to load one of the SMO binaries
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
#Connect to the server with integrated Windows auth
$Connection = New-Object "Microsoft.SqlServer.Management.Smo.Server" -ArgumentList Server1
#List the databases
$Connection.Databases
#List the names of the databases
$Connection.Databases | Select -ExpandProperty Name
最後,它聽起來就像你所關心的發現。在查找單個數據庫之前,您可能會考慮查找SQL實例,然後您可以逐案進行調查。 Boe Prox寫道Get-SQLInstance這隻需要註冊表特權,並且會吐出SQL實例名稱,SQL版本和其他有用的信息。
SQL Server實例上的數據庫未存儲在註冊表中或系統中任何位置的平面文件中。它存儲在主數據庫中的系統表中。
根據您對服務器的權限,唯一可以獲取數據的地方是通過WMI。看到這個答案on StackOverflow。 WMI中的值不存儲在系統中,但SQL Server通過提供程序接口與它通話,數據仍來自SQL Server實例。
這些實際上是您的唯一選擇,登錄到服務器並運行TSQL查詢或使用WMI。
我會調查一下!我搜索時找不到這個。謝謝。 – krmarshall87 2014-12-27 20:01:20