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ự SqlDataSourceEnumerator
khô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-Service
cmdlet.
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 myserver
trong dấu nhắc DOS và -Quiet
cờ chỉ cần trả về true
hoặc false
. Điều này sẽ mặc định là 4 ping để thiết lập -Count 2
chỉ làm cho nó thực hiện hai lần thay thế.
Biến [string[]]$server
là một phương thức được sử dụng để tuyên bố $server
sẽ 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-ADComputer
lệ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 -Filter
trê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-Verbose
và 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 SystemName
tí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í.