Saya telah ditugaskan untuk menemukan semua contoh SQL Server yang berjalan dalam domain kami. Dalam beberapa kasus ada beberapa contoh per server. Saya telah melihat dua metode PowerShell berbeda untuk menemukan instance ini, tetapi tampaknya tidak menemukan semua instance.
1) Gunakan WMI
$srvr = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $computerName
$instances = $srvr | ForEach-Object {$_.ServerInstances} | Select @{Name="fullName";Expression={$computerName +"\"+ $_.Name}}
return $instances
2) Gunakan remote registry (seperti pada Get-SQLInstance 1 )
Masalah terbesar yang saya hadapi adalah bahwa tidak semua server yang saya tahu menjalankan dengan penyedia WMI SQL Server juga tidak semuanya memungkinkan remote registry. Apakah ada metode ketiga? Saya dapat menggunakan Remote Desktop untuk mengakses semua server tapi saya melihat sekitar 30 mesin dan ingin menghindari langkah-langkah manual jika memungkinkan. Ini hanya perlu bekerja untuk SQL Server 2008 dan lebih tinggi dan sementara itu akan menyenangkan untuk mengetahui tentang layanan SQL Server lainnya (SSIS / SSAS / SSRS) fokus utama saya adalah pada SQL Server itu sendiri.
sumber
Jawaban:
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 daripadaGet-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.
Ini sedikit lebih dari apa yang biasanya saya gunakan tetapi kalau-kalau ada orang lain yang ingin menggunakannya. The
Test-Connection
setara denganping myserver
di DOS prompt dan-Quiet
bendera hanya hanya memiliki itu kembalitrue
ataufalse
. 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:atau
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 atasContoh:
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 menambahkanSystemName
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.sumber
Satu-satunya cara yang saya tahu untuk menemukan contoh di lingkungan tanpa mengetahui semua server yang mungkin memiliki dan nama-nama khusus mereka, akan membuat panggilan ke System.Data.Sql.SqlDataSourceEnumerator.GetDataSources (). Metode ini dilengkapi dengan banyak catatan kaki. Berikut ini cuplikan yang ditarik langsung dari sumber daya MSDN:
Panggilannya sederhana dari PowerShell:
Metode itu mengembalikan
DataTable
objek yang dapat Anda tangani sesuai.sumber
Jika Layanan Peramban SQL aktif, Anda dapat meminta layanan untuk SQL Instances dengan kode PowerShell di bawah ini. Itu mengimplementasikan commandlets berikut untuk melakukan query:
Dapatkan-SqlBrowserInstanceDac
sumber
Cara lain untuk mengidentifikasi kemungkinan SQL Instances adalah dengan melihat Service Principle Names (SPNs) yang terdaftar di Active Directory. Ketika Anda terhubung ke SQL Server jarak jauh dengan Windows Authentication, SPN digunakan dalam proses otentikasi. Kehadiran SPN tidak berarti bahwa server / instance pasti ada dan berjalan tetapi itu memberi Anda daftar kemungkinan contoh yang saya temukan lebih komprehensif dari beberapa pendekatan lain.
Untuk membuat hidup lebih mudah, saya menggunakan cmdlet Get-SPN dari: https://gallery.technet.microsoft.com/scriptcenter/Get-SPN-Get-Service-3bd5524a
Unduh skrip Get-SPN.ps1, simpan ke C: \ powershell_scripts \ Get-SPN.ps1 dan jalankan yang berikut di PowerShell:
(Jelas Anda dapat menyimpan skrip ke lokasi lain, cukup perbarui baris pertama sesuai kebutuhan.)
Ini akan mencantumkan semua SQL Server SPN pada domain saat ini, termasuk "spesifikasi" yang berkaitan dengan port / instance layanan.
sumber
Dapatkan-Layanan -KomputerName * MSSQL * | Where-Object {$ _. Status -eq "Running"}
Itu harus diberi nama dan contoh default. Ulangi daftar mesin Anda, dll.
sumber
Baru saja mencoba ini: [System.Data.Sql.SqlDataSourceEnumerator] :: Instance.GetDataSources ()
Tidak banyak data yang dikembalikan tetapi mendeteksi semua server sql yang saya jalankan di lingkungan VM.
sumber