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 SqlDataSourceEnumeratorflaky 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-Servicecmdlet.
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-Connectionsetara dengan ping myserverdi DOS prompt dan -Quietbendera hanya hanya memiliki itu kembali trueatau false. Ini akan default ke 4 ping jadi pengaturan -Count 2hanya membuatnya melakukannya dua kali sebagai gantinya.
Variabel [string[]]$serveradalah metode yang digunakan untuk menyatakan bahwa $serverakan 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-ADComputercmdlet. Namun kata peringatan pastikan Anda menggunakan barang bagus -Filterdi 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-ADComputeruntuk 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-Verbosedan 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 SystemNameproperti 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.