Jika Anda menginginkan sesuatu yang akan berguna untuk masa depan saya mungkin akan menghindari mencoba mencari registri. Sarang untuk SQL Server telah sedikit berubah selama bertahun-tahun dan itu bisa menyulitkan untuk mengikutinya.
Metode dengan SqlDataSourceEnumerator
flaky pada waktu dan meskipun saya akan menggunakannya, bukan bukti nyata bahwa instance ada di jaringan. Saya percaya ini tergantung pada Layanan Peramban SQL juga, yang sebagian besar waktu saya temukan dinonaktifkan.
Saya akan memanfaatkan kelas WMI win32_Service
. Saya menggunakan ini karena ia menawarkan lebih banyak informasi tentang layanan daripada Get-Service
cmdlet.
Saya menulis semuanya sebagai fungsi secara umum karena Anda dapat menggunakan ini untuk benar-benar hanya melakukan pemeriksaan harian atau verifikasi layanan untuk pemecahan masalah.
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
}
}
}
Ini sedikit lebih dari apa yang biasanya saya gunakan tetapi kalau-kalau ada orang lain yang ingin menggunakannya. The Test-Connection
setara dengan ping myserver
di DOS prompt dan -Quiet
bendera hanya hanya memiliki itu kembali true
atau false
. Ini akan default ke 4 ping jadi pengaturan -Count 2
hanya membuatnya melakukannya dua kali sebagai gantinya.
Variabel [string[]]$server
adalah metode yang digunakan untuk menyatakan bahwa $server
akan menerima array nama server. Jadi contoh panggilan fungsi ini dapat terlihat seperti:
Get-ServiceStatus -server (Get-Content C:\temp\MyServerList.txt)
atau
$servers = 'MyServer1','MyServer2','MyServer3'
Get-ServiceStatus -server $servers
EDIT
Komentar yang dicatat adalah di atas tergantung pada daftar server yang disediakan. Dalam kasus di mana saya tidak diberikan daftar itu Anda memiliki beberapa opsi lain.
Jika saya berada di lingkungan Active Directory saya dapat menggunakan modul ActiveDirectory di PowerShell untuk menarik daftar semua server pada domain dengan Get-ADComputer
cmdlet. Namun kata peringatan pastikan Anda menggunakan barang bagus -Filter
di domain besar.
Saya juga hanya melakukan pemindaian IP (dengan persetujuan) dari jaringan yang memberi saya alamat IP tempat port 1433 ditemukan terbuka. Saya akan mengambil daftar IP itu dan menggunakannya Get-ADComputer
untuk menemukan nama komputer domain, lalu meneruskannya ke fungsi di atas
Contoh:
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
EDIT
Edit yang disarankan untuk digunakan Write-Verbose
dan juga ditambahkan dalam blok coba / tangkap, sementara itu mungkin berguna, dan dalam kebanyakan kasus praktik kode, saya akan menyerahkannya kepada orang yang ingin menggunakan fungsi ini untuk menambahkan kode atau fungsi tambahan itu. Hanya berusaha memberikan contoh dasar untuk melanjutkan. Saya memang menambahkan SystemName
properti ke output untuk memasukkan informasi pengembalian nama server yang sebenarnya, lakukan ini pada fungsi-fungsi lain yang umumnya tidak menggunakan ini untuk lebih dari satu server pada satu waktu sehingga menyelinap pikiran saya.