หากคุณต้องการสิ่งที่จะเป็นประโยชน์สำหรับอนาคตฉันอาจจะหลีกเลี่ยงการพยายามค้นหารีจิสทรี ลมพิษสำหรับ SQL Server มีการเปลี่ยนแปลงเล็กน้อยในช่วงหลายปีที่ผ่านมาและอาจเป็นปัญหาในการติดตาม
วิธีการที่SqlDataSourceEnumerator
ไม่สม่ำเสมอในบางครั้งและถึงแม้ว่าฉันจะใช้มันไม่ใช่หลักฐานที่ชัดเจนว่ามีอินสแตนซ์อยู่ในเครือข่าย ฉันเชื่อว่ามันขึ้นอยู่กับ SQL Browser Service ด้วยซึ่งส่วนใหญ่ฉันพบว่าปิดการใช้งาน
win32_Service
ฉันจะใช้ชั้น WMI ฉันใช้สิ่งนี้เพราะให้ข้อมูลเพิ่มเติมเกี่ยวกับบริการมากกว่าที่Get-Service
cmdlet ทำ
ฉันเขียนทุกอย่างเป็นฟังก์ชั่นโดยทั่วไปเพราะคุณสามารถใช้สิ่งนี้เพื่อตรวจสอบรายวันหรือตรวจสอบบริการเพื่อแก้ไขปัญหา
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
}
}
}
นี่เป็นอะไรที่มากกว่าปกติฉันใช้ แต่ในกรณีที่มีคนอื่นเจอและต้องการใช้มัน Test-Connection
เท่ากับping myserver
ใน DOS ให้และ-Quiet
ธงเพียงแค่ได้มันกลับมาหรือtrue
false
สิ่งนี้จะมีค่าเริ่มต้นเป็น 4 pings ดังนั้นการตั้งค่า-Count 2
ทำได้เพียงสองครั้งแทน
ตัวแปร[string[]]$server
เป็นวิธีที่ใช้ในการระบุว่า$server
จะยอมรับอาร์เรย์ของชื่อเซิร์ฟเวอร์ ดังนั้นตัวอย่างการเรียกใช้ฟังก์ชันนี้อาจมีลักษณะดังนี้:
Get-ServiceStatus -server (Get-Content C:\temp\MyServerList.txt)
หรือ
$servers = 'MyServer1','MyServer2','MyServer3'
Get-ServiceStatus -server $servers
แก้ไข
ความคิดเห็นที่ระบุไว้ข้างต้นจะขึ้นอยู่กับรายการของเซิร์ฟเวอร์ที่ให้ไว้ ในกรณีที่ฉันไม่ได้ระบุว่าคุณมีตัวเลือกอื่น ๆ
ถ้าฉันอยู่ในสภาพแวดล้อมของ Active Directory ฉันสามารถใช้โมดูลActiveDirectoryใน PowerShell เพื่อดึงรายการเซิร์ฟเวอร์ทั้งหมดในโดเมนด้วยGet-ADComputer
cmdlet คำเตือนแม้ว่าให้แน่ใจว่าคุณใช้ดี-Filter
ในโดเมนขนาดใหญ่
ฉันเพิ่งทำการสแกน IP (ด้วยการอนุมัติ) ของเครือข่ายที่ให้ที่อยู่ IP ที่พบพอร์ต 1433 เปิดอยู่ ฉันจะใช้รายการ IP นั้นและใช้Get-ADComputer
เพื่อค้นหาชื่อคอมพิวเตอร์โดเมนจากนั้นส่งผ่านไปยังฟังก์ชั่นด้านบน
ตัวอย่าง:
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
แก้ไข
การแก้ไขที่แนะนำเพื่อใช้Write-Verbose
และเพิ่มในลอง / จับบล็อกในขณะที่อาจมีประโยชน์และในกรณีส่วนใหญ่การฝึกรหัสฉันจะปล่อยให้ขึ้นอยู่กับคนที่ต้องการใช้ฟังก์ชั่นนี้เพื่อเพิ่มรหัสหรือฟังก์ชั่นเพิ่มเติม เพียงแค่พยายามให้ตัวอย่างพื้นฐานเพื่อดำเนินการต่อ ฉันเพิ่มSystemName
คุณสมบัติไปยังเอาต์พุตเพื่อรวมชื่อเซิร์ฟเวอร์ที่ส่งคืนข้อมูลจริงทำสิ่งนี้ในฟังก์ชั่นอื่น ๆ โดยทั่วไปไม่ใช้สิ่งนี้กับเซิร์ฟเวอร์มากกว่าหนึ่งเครื่องในแต่ละครั้งดังนั้นมันจึงลื่นใจ