Nếu bạn muốn một cái gì đó sẽ hữu ích cho tương lai, có lẽ tôi sẽ tránh xa việc cố gắng tìm kiếm sổ đăng ký. Các tổ ong cho SQL Server đã thay đổi một chút trong những năm qua và nó có thể gây rắc rối để theo kịp.
Phương thức với sự SqlDataSourceEnumeratorkhông ổn định đôi khi và mặc dù tôi sẽ sử dụng nó, không phải là bằng chứng cụ thể cho thấy các trường hợp trên mạng. Tôi tin rằng nó cũng phụ thuộc vào Dịch vụ Trình duyệt SQL, phần lớn thời gian tôi thấy bị vô hiệu hóa.
Tôi sẽ sử dụng lớp WMI win32_Service. Tôi sử dụng điều này bởi vì nó cung cấp nhiều thông tin về dịch vụ hơn Get-Servicecmdlet.
Tôi viết mọi thứ như các chức năng nói chung vì bạn có thể sử dụng điều này để thực sự kiểm tra hàng ngày hoặc xác minh dịch vụ để khắc phục sự cố.
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
}
}
}
Đây là một chút nhiều hơn những gì tôi thường sử dụng nhưng trong trường hợp người khác đi qua và muốn sử dụng nó. Tương Test-Connectionđương với ping myservertrong dấu nhắc DOS và -Quietcờ chỉ cần trả về truehoặc false. Điều này sẽ mặc định là 4 ping để thiết lập -Count 2chỉ làm cho nó thực hiện hai lần thay thế.
Biến [string[]]$serverlà một phương thức được sử dụng để tuyên bố $serversẽ chấp nhận một mảng các tên máy chủ. Vì vậy, một cuộc gọi ví dụ của chức năng này có thể trông giống như:
Get-ServiceStatus -server (Get-Content C:\temp\MyServerList.txt)
hoặc là
$servers = 'MyServer1','MyServer2','MyServer3'
Get-ServiceStatus -server $servers
BIÊN TẬP
Một nhận xét được lưu ý là ở trên không phụ thuộc vào danh sách các máy chủ được cung cấp. Trong trường hợp tôi không được cung cấp danh sách đó, bạn có một vài lựa chọn khác.
Nếu tôi ở trong môi trường Active Directory, tôi có thể sử dụng mô-đun ActiveDirectory trong PowerShell để lấy danh sách tất cả các máy chủ trên miền bằng Get-ADComputerlệnh ghép ngắn. Một lời cảnh báo mặc dù đảm bảo bạn sử dụng hàng hóa -Filtertrên các tên miền lớn.
Tôi cũng chỉ đơn giản là thực hiện quét IP (có sự chấp thuận) của một mạng cung cấp cho tôi các địa chỉ IP nơi cổng 1433 được tìm thấy mở. Tôi sẽ lấy danh sách IP đó và sử dụng Get-ADComputerđể tìm tên máy tính miền, sau đó chuyển nó vào chức năng trên
Thí dụ:
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
BIÊN TẬP
Chỉnh sửa được đề xuất để sử dụng Write-Verbosevà cũng thêm vào khối thử / bắt, trong khi điều đó có thể hữu ích và trong hầu hết các trường hợp thực hành mã, tôi sẽ để lại cho người muốn sử dụng chức năng này để thêm mã hoặc chức năng bổ sung đó. Chỉ cần cố gắng cung cấp một ví dụ cơ bản để tiếp tục. Tôi đã thêm thuộc SystemNametính vào đầu ra để bao gồm thông tin trả về tên máy chủ thực tế, làm điều này trên các chức năng khác thường không sử dụng điều này cho nhiều máy chủ cùng một lúc để nó bị mất trí.