PowerShell का उपयोग करके SQL सर्वर के सभी चल रहे इंस्टेंस को खोजने के लिए सबसे प्रभावी तरीका क्या है?


13

मुझे SQL सर्वर के उन सभी उदाहरणों की खोज करने का काम सौंपा गया है जो हमारे डोमेन में चल रहे हैं। कई मामलों में प्रति सर्वर कई उदाहरण हैं। मैंने इन उदाहरणों को खोजने के दो अलग-अलग PowerShell तरीके देखे हैं, लेकिन सभी उदाहरणों को खोजने के लिए न तो लगता है।

1) 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) दूरस्थ रजिस्ट्री का उपयोग करें (Get-SQLInstance 1 के साथ )

सबसे बड़ी समस्या यह है कि मैं उन सभी सर्वरों के बारे में नहीं जानता जिनके बारे में मैं जानता हूं कि वे SQL सर्वर WMI प्रदाता के साथ चल रहे हैं और न ही वे सभी दूरस्थ रजिस्ट्री की अनुमति दे रहे हैं। क्या कोई तीसरी विधि है? मैं सभी सर्वरों को एक्सेस करने के लिए रिमोट डेस्कटॉप का उपयोग कर सकता हूं लेकिन मैं लगभग 30 मशीनों को देख रहा हूं और यदि संभव हो तो मैन्युअल चरणों से बचना चाहता हूं। यह केवल SQL Server 2008 और उच्चतर के लिए काम करने की आवश्यकता है और जबकि अन्य SQL सर्वर सेवाओं (SSIS / SSAS / SSRS) के बारे में जानना अच्छा होगा, मेरा मुख्य ध्यान SQL सर्वर पर ही है।


जवाबों:


12

यदि आप ऐसा कुछ चाहते हैं जो भविष्य के लिए उपयोगी होगा, तो मैं शायद रजिस्ट्री को खोजने की कोशिश कर रहा हूं। SQL सर्वर के लिए पित्ती पिछले कुछ वर्षों में बदल गई है और इसे साथ रखना परेशानी भरा हो सकता है।

SqlDataSourceEnumeratorसमय के साथ विधि परतदार है और यद्यपि मैं इसका उपयोग करूंगा, न कि ठोस सबूत जो नेटवर्क पर उदाहरण हैं। मेरा मानना ​​है कि यह SQL ब्राउज़र सेवा पर भी निर्भर करता है, जो कि ज्यादातर समय मुझे अक्षम लगता है।

मैं WMI वर्ग का उपयोग करूंगा win32_Service। मैं इसका उपयोग करता हूं क्योंकि यह Get-Servicecmdlet की तुलना में सेवा के बारे में अधिक जानकारी प्रदान करता है।

मैं आमतौर पर कार्यों के रूप में सब कुछ लिखता हूं क्योंकि आप इसका उपयोग वास्तव में समस्या निवारण के लिए सेवा की दैनिक जांच या सत्यापन कर सकते हैं।

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में एक डॉस शीघ्र और -Quietझंडा बस सिर्फ यह है लौटने trueया false। यह 4 पिंग्स के लिए डिफॉल्ट होगा इसलिए सेटिंग -Count 2सिर्फ इसे दो बार करने के बजाय करता है।

वैरिएबल [string[]]$serverएक ऐसी विधि है जिसका उपयोग यह $serverबताने के लिए किया जाता है कि किसी सर्वर नाम को स्वीकार किया जाएगा। तो इस फ़ंक्शन का एक उदाहरण कॉल कुछ इस तरह दिख सकता है:

Get-ServiceStatus -server (Get-Content C:\temp\MyServerList.txt)

या

$servers = 'MyServer1','MyServer2','MyServer3'
Get-ServiceStatus -server $servers

संपादित करें

एक उल्लेखनीय टिप्पणी उपरोक्त सर्वरों की एक सूची पर निर्भर करती है जो प्रदान की जा रही है। उन मामलों में जहां मुझे वह सूची प्रदान नहीं की गई है जो आपके पास कुछ अन्य विकल्प हैं।

  • यदि मैं एक सक्रिय निर्देशिका वातावरण में हूं तो मैं cmdlet के साथ डोमेन पर सभी सर्वरों की सूची खींचने के लिए PowerShell में ActiveDirectory मॉड्यूल का उपयोग कर सकता हूं Get-ADComputer। चेतावनी का एक शब्द हालांकि यह सुनिश्चित करता है कि आप -Filterबड़े डोमेन पर एक अच्छा उपयोग करें ।

  • मैंने केवल एक नेटवर्क के आईपी स्कैन (अनुमोदन के साथ) किया है जो मुझे आईपी पते देता है जहां पोर्ट 1433 खुला पाया गया था। मैं उस आईपी सूची को ले जाऊंगा और 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वास्तविक सर्वर नाम वापसी जानकारी को शामिल करने के लिए संपत्ति को आउटपुट में जोड़ा , ऐसा अन्य कार्यों पर करें आमतौर पर एक समय में एक से अधिक सर्वर के लिए इसका उपयोग न करें ताकि यह मेरे दिमाग से फिसल जाए।


वह कार्य जो आपको प्रदान किए जाने वाले सर्वरों की सूची के साथ शुरू किया गया है। यह हमेशा नहीं माना जा सकता है।
थॉमस स्ट्रिंगर

केवल 1433 पोर्ट को स्कैन करने के लिए सीमित करने वाली स्पष्टता के लिए किसी भी सर्वर को केवल नामित इंस्टेंसेस (या डिफ़ॉल्ट इंस्टेंस के साथ एक अलग पोर्ट का उपयोग करने के लिए हार्ड-कोडेड) छोड़ देगा। हो सकता है कि कोई बड़ी बात न हो लेकिन वहाँ बहुत सारे पागल लोग हैं जो उस बंदरगाह को चौड़ा करते हैं।
हारून बर्ट्रेंड

सच है, यह सिर्फ एक प्रारंभिक बिंदु है। जहां पोर्ट आमतौर पर सेट होते हैं, मैंने पाया है कि क्लाइंट्स के पास आमतौर पर उन सर्वरों का उल्लेख होता है (उनसे अवगत)। ब्रायन केली द्वारा इस विधि को खोजा गया लेकिन इसे आज़माया नहीं गया।

मुझे लगता है कि दोनों रजिस्ट्री विधि और win32_service WMI को एक कमबैक के रूप में संयोजित करने के लिए अधिकांश सर्वर मिलना चाहिए, और फिर शेष की एक मैन्युअल खोज काम करेगी। एक सुखद साइड इफेक्ट के रूप में, मैं उन सेवाओं पर कुछ जानकारी खींच सकता हूं जो चल रही हैं, लेकिन ज़रूरत नहीं है, सर्वर जो मुझे एक्सेस करने की अनुमति नहीं दे रहे हैं, आदि
Elsimer

5

एक ही तरीका है कि मैं सभी संभावित स्वयं के सर्वर और उनके विशेष नामों को जाने बिना एक वातावरण में उदाहरणों की खोज करता हूं, जो System.Data.Sql.SqlDataSourceEnumerator.GetDDSSource () पर कॉल करना होगा यह विधि बहुत सारे फुटनोट्स के साथ आती है, हालाँकि। यहाँ एक स्निपेट है जिसे सीधे उस MSDN संसाधन से खींचा गया है:

नेटवर्क पर डेटा स्रोतों का पता लगाने के लिए SqlDataSourceEnumerator द्वारा उपयोग किए जाने वाले तंत्र की प्रकृति के कारण, विधि हमेशा उपलब्ध सर्वरों की पूरी सूची नहीं लौटाएगी , और प्रत्येक कॉल पर सूची समान नहीं हो सकती है। यदि आप इस फ़ंक्शन का उपयोग उपयोगकर्ताओं को किसी सूची से सर्वर का चयन करने देने के लिए करते हैं, तो सुनिश्चित करें कि आप हमेशा उस नाम में टाइप करने के लिए एक विकल्प प्रदान करते हैं जो सूची में नहीं है, अगर सर्वर एन्यूमरेशन सभी उपलब्ध सर्वरों को वापस नहीं करता है। । इसके अलावा, इस विधि को निष्पादित करने में एक महत्वपूर्ण राशि लग सकती है , इसलिए प्रदर्शन के महत्वपूर्ण होने पर इसे कॉल करने में सावधानी बरतें।

PowerShell से कॉल सरल है:

[System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources()

वह विधि एक DataTableऑब्जेक्ट देता है जिसे आप तदनुसार संभाल सकते हैं।


3

यदि SQL ब्राउज़र सेवा सक्रिय है, तो आप नीचे दिए गए PowerShell कोड के साथ SQL इंस्टेंस के लिए सेवा को क्वेरी कर सकते हैं। यह प्रश्नों को करने के लिए निम्नलिखित कमांडलेट को लागू करता है:

  • Get-SqlBrowserInstanceList
  • Get-SqlBrowserInstanceInfo
  • Get-SqlBrowserInstanceDac

    function Parse-ServerResponse([byte[]] $responseData)
    {
        [PSObject[]] $instances = @()
    
        if (($responseData -ne $null) -and ($responseData[0] -eq 0x05))
        {
            $responseSize = [System.BitConverter]::ToInt16($responseData, 1)
    
            if ($responseSize -le $responseData.Length - 3)
            {
                # Discard any bytes beyond the received response size. An oversized response is usually the result of receiving multiple replies to a broadcast request.
                $responseString = [System.Text.Encoding]::Default.GetString(($responseData | Select -Skip 3 -First $responseSize))
                $instanceResponses = $responseString.Split(@(";;"), [System.StringSplitOptions]::RemoveEmptyEntries)
    
                $instances = foreach ($instanceResponse in $instanceResponses)
                {
                    $instanceResponseValues = $instanceResponse.Split(";")
                    $instanceResponseHash = @{}
                    for ($index = 0; $index -lt $instanceResponseValues.Length; $index += 2)
                    {
                        $instanceResponseHash[$instanceResponseValues[$index]] = $instanceResponseValues[$index + 1]
                    }
    
                    New-Object PSObject -Property $instanceResponseHash
                }
            }
            else
            {
                Write-Warning "The response was too short. Expected $($responseSize) bytes but got $($responseData.Length - 3)."
            }
        }
    
        return ,$instances
    }
    
    function Parse-ServerResponseDac([byte[]] $responseData)
    {
        $dacPort = 0
    
        if (($responseData -ne $null) -and ($responseData[0] -eq 0x05))
        {
            $responseSize = [System.BitConverter]::ToUInt16($responseData, 1)
    
            if (($responseData.Length -eq 6) -and ($responseSize -eq 6))
            {
                if ($responseData[3] -eq 0x01)
                {
                    $dacPort = [System.BitConverter]::ToUInt16($responseData, 4)
                }
                else
                {
                    Write-Error "An unexpected protocol version was returned. Expected 0x01 but got $($requestData[3])."
                }
            }
            else
            {
                Write-Error "The response size was incorrect."
            }
        }
    
        return $dacPort
    }
    
    function Get-SqlBrowserInstanceList
    {
        <#
        .SYNOPSIS
        Gets the list of available SQL Instances on the server.
        .DESCRIPTION
        Gets the list of available SQL Instances on the server by querying the SQL Browser Service on port 1434.
        .EXAMPLE
        Get-SqlBrowserInstanceList servername
        .EXAMPLE
        Get-SqlBrowserInstanceList servername.dnsdomain.tld
        .EXAMPLE
        Get-SqlBrowserInstanceList $env:COMPUTERNAME
        .EXAMPLE
        Get-SqlBrowserInstanceList 192.168.1.255 -Broadcast
        .EXAMPLE
        Get-SqlBrowserInstanceList 255.255.255.255 -Broadcast
        .PARAMETER $ServerName
        The name or IP Address of the server.
        .PARAMETER $Broadcast
        If the broadcast switch is specified, the query will be sent as a broadcast and may receive replies from multiple hosts; otherwise, the query is sent to a single server.
        #>
        [CmdletBinding(SupportsShouldProcess = $False)]
        param
        (
            [Parameter(Mandatory = $True, ValueFromPipeLine = $True)]
            [string] $ServerName,
            [switch] $Broadcast
        )
    
        process
        {   
            [System.Net.IPAddress] $ipAddress = [System.Net.Dns]::GetHostAddresses($serverName) | Select -First 1
            $parsedResponses = @()
    
            if ($ipAddress -ne $null)
            {
                [System.Net.IPEndPoint] $localIPEndPoint = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Any, 0)
                [System.Net.IPEndPoint] $remoteIPEndPoint = New-Object System.Net.IPEndPoint($ipAddress, 1434)
    
                if ($ipAddress -eq [System.Net.IPAddress]::Broadcast)
                {
                    $Broadcast = $true
                }
    
                [System.Net.Sockets.UdpClient] $receiver = New-Object System.Net.Sockets.UdpClient
                $receiver.Client.ReceiveTimeout = 30000
    
                [byte] $queryMode = 0x03
                $sleepDuration = 1
                [System.Net.Sockets.UdpClient] $sender = $null
    
                if ($Broadcast -eq $true)
                {
                    Write-Verbose "Using broadcast mode."
                    $queryMode = 0x02
                    $sleepDuration = 30
    
                    # Set the receiver to allow another client on the same socket.
                    $receiver.Client.SetSocketOption([System.Net.Sockets.SocketOptionLevel]::Socket, [System.Net.Sockets.SocketOptionName]::ReuseAddress, $true)
                    $receiver.Client.Bind($localIPEndPoint)
    
                    # Because broadcasting from this UdpClient instance causes the underlying socket to be unable to receive normally, a separate sender must be bound to the same socket as the receiver.
                    # NOTE: Windows Firewall does not view a reused socket as being part of the same conversation. If Windows Firewall is active, this requires special firewall rules to work.
                    $sender = New-Object System.Net.Sockets.UdpClient
                    $sender.EnableBroadcast = $Broadcast
                    $sender.Client.SetSocketOption([System.Net.Sockets.SocketOptionLevel]::Socket, [System.Net.Sockets.SocketOptionName]::ReuseAddress, $true)
                    $sender.Client.Bind($receiver.Client.LocalEndPoint);
                }
                else
                {
                    $sender = $receiver
                    $receiver.Client.Bind($localIPEndPoint)
                }
    
    
                $responses = @{}
    
                try
                {
                    # Send the broadcast.
                    Write-Verbose "Sending request to $($ipAddress)..."
                    $sender.Connect($remoteIPEndPoint)
                    $bytesSent = $sender.Send(@($queryMode), 1)
    
                    # Wait to give responses time to arrive.
                    Sleep $sleepDuration
    
                    do
                    {
                        [System.Net.IPEndPoint] $responderIPEndPoint = $null
                        $response = $receiver.Receive([ref] $responderIPEndPoint)
                        $responder = $responderIPEndPoint.ToString()
    
                        if ($responses.Contains($responder))
                        {
                            $responses[$responder] += $response
                        }
                        else
                        {
                            $responses.Add($responder, $response)
                        }
                    } while ($receiver.Available -gt 0)
                }
                finally
                {
                    if ($sender -ne $receiver)
                    {
                        $sender.Close()
                        $sender.Dispose()
                    }
    
                    $receiver.Close()
                    $receiver.Dispose()
                }
    
                foreach ($responseItem in $responses.GetEnumerator())
                {
                    Write-Verbose "Parsing the response from $($responseItem.Name)..."
                    $parsedResponse = Parse-ServerResponse $responseItem.Value
                    $parsedResponses += $parsedResponse
                    Write-Verbose ($parsedResponse | ft ServerName, InstanceName, tcp, np, Version, IsClustered -AutoSize |Out-String)
                }
            }
    
            return $parsedResponses
        }
    }
    
    function Get-SqlBrowserInstanceInfo
    {
        <#
        .SYNOPSIS
        Gets information about the specified SQL Instance from the server.
        .DESCRIPTION
        Gets information about the specified SQL Instance from the server by querying the SQL Browser Service on port 1434.
        .EXAMPLE
        Get-SqlBrowserInstanceInfo servername instancename
        .EXAMPLE
        Get-SqlBrowserInstanceInfo servername.dnsdomain.tld instancename
        .EXAMPLE
        Get-SqlBrowserInstanceInfo $env:COMPUTERNAME
        .PARAMETER $ServerName
        The name or IP Address of the server.
        .PARAMETER $InstanceName
        The name of the SQL Instance.    #>
        [CmdletBinding(SupportsShouldProcess = $False)]
        param
        (
            [Parameter(Mandatory = $True, ValueFromPipeLine = $True)]
            [string] $ServerName,
            [Parameter(Mandatory = $True, ValueFromPipeLine = $False)]
            [string] $InstanceName
        )
    
        process
        {   
            $instances = @()
            [System.Net.IPAddress] $ipAddress = $null
    
            $ipAddress = [System.Net.Dns]::GetHostAddresses($serverName) | Select -First 1
    
            if ($ipAddress -ne $null)
            {
                [System.Net.IPEndPoint] $ipEndPoint = New-Object System.Net.IPEndPoint($ipAddress, 1434)
                [System.Net.Sockets.UdpClient] $udpClient = New-Object System.Net.Sockets.UdpClient
                $udpClient.Client.ReceiveTimeout = 10000
    
                $instanceNameData = [System.Text.Encoding]::Default.GetBytes($instanceName)
                [byte[]] $requestData = @(0x04) + $instanceNameData + 0x00
                [byte[]] $responseData = $null
    
                try
                {
                    $udpClient.Connect($ipEndPoint)
    
                    $bytesSent = $udpClient.Send($requestData, $requestData.Length)
    
                    $responseData = do
                    {
                        $udpClient.Receive([ref] $ipEndPoint)
                    } while ($udpClient.Available -gt 0)
                }
                finally
                {
                    $udpClient.Close()
                    $udpClient.Dispose()
                }
    
                $instances = Parse-ServerResponse $responseData
            }
    
            return $instances
        }
    }
    
    function Get-SqlBrowserInstanceDac
    {
        <#
        .SYNOPSIS
        Gets the Dedicated Administrator Connection port number for the specified SQL Instance on the server.
        .DESCRIPTION
        Gets the Dedicated Administrator Connection port number for the specified SQL Instance on the server by querying the SQL Browser Service on port 1434.
        .EXAMPLE
        Get-SqlBrowserInstanceDac servername instancename
        .EXAMPLE
        Get-SqlBrowserInstanceDac servername.dnsdomain.tld instancename
        .EXAMPLE
        Get-SqlBrowserInstanceDac $env:COMPUTERNAME instancename
        .PARAMETER $ServerName
        The name or IP Address of the server.
        .PARAMETER $InstanceName
        The name of the SQL Instance.
        #>
        [CmdletBinding(SupportsShouldProcess = $False)]
        param
        (
            [Parameter(Mandatory = $True, ValueFromPipeLine = $True)]
            [string] $ServerName,
            [Parameter(Mandatory = $True, ValueFromPipeLine = $False)]
            [string] $InstanceName
        )
    
        process
        {   
            [System.UInt16] $dacPort = 0
            [System.Net.IPAddress] $ipAddress = $null
    
            $ipAddress = [System.Net.Dns]::GetHostAddresses($serverName) | Select -First 1
    
            if ($ipAddress -ne $null)
            {
                [System.Net.IPEndPoint] $ipEndPoint = New-Object System.Net.IPEndPoint($ipAddress, 1434)
                [System.Net.Sockets.UdpClient] $udpClient = New-Object System.Net.Sockets.UdpClient
                $udpClient.Client.ReceiveTimeout = 30000
    
                $instanceNameData = [System.Text.Encoding]::Default.GetBytes($instanceName)
                [byte[]] $requestData = @(0x0F) + 0x01 + $instanceNameData + 0x00
                [byte[]] $responseData = $null
    
                try
                {
                    $udpClient.Connect($ipEndPoint)
    
                    $bytesSent = $udpClient.Send($requestData, $requestData.Length)
    
                    $responseData = do
                    {
                        $udpClient.Receive([ref] $ipEndPoint)
                    } while ($udpClient.Available -gt 0)
                }
                finally
                {
                    $udpClient.Close()
                    $udpClient.Dispose()
                }
    
                $dacPort = Parse-ServerResponseDac($responseData)
            }
    
            return $dacPort
        }
    }

2

SQL इंस्टेंस को पहचानने का दूसरा तरीका सक्रिय निर्देशिका में सूचीबद्ध सेवा सिद्धांत नाम (SPNs) को देखना है। जब आप SQL सर्वर से दूरस्थ रूप से Windows प्रमाणीकरण के साथ कनेक्ट करते हैं तो प्रमाणीकरण प्रक्रिया में एक SPN का उपयोग किया जाता है। एक एसपीएन की उपस्थिति का मतलब यह नहीं है कि सर्वर / इंस्टेंस निश्चित रूप से वहां है और चल रहा है, लेकिन यह आपको संभावित उदाहरणों की एक सूची देता है जो मुझे कुछ अन्य दृष्टिकोणों से अधिक व्यापक पाया गया है।

जीवन को आसान बनाने के लिए मैं Get-SPN cmdlet का उपयोग करता हूं: https://gallery.technet.microsoft.com/scriptcenter/Get-SPN-Get-Service-3bd5524a

Get-SPN.ps1 स्क्रिप्ट डाउनलोड करें, इसे C: \ powerhell_scripts \ Get-SPN.ps1 पर सहेजें और PowerShell में निम्नलिखित चलाएँ:

. "C:\powershell_scripts\Get-SPN.ps1"
Get-SPN -ServiceClass MSSQLSvc

(जाहिर है आप स्क्रिप्ट को किसी अन्य स्थान पर सहेज सकते हैं, बस आवश्यकतानुसार पहली पंक्ति को अपडेट करें।)

यह सभी एसक्यूएल सर्वर एसपीएन को "स्पेसिफिकेशन" सहित वर्तमान डोमेन पर सूचीबद्ध करेगा, जो सेवा के पोर्ट / उदाहरण से संबंधित है।


मैंने देखा है कि हमारी अधिकांश SQL सर्वर मशीनें SPN (या रखरखाव लॉग में कुछ ऐसी चेतावनी) प्राप्त करने में असमर्थ हैं। क्या वे अब भी उस स्क्रिप्ट का उपयोग करके दिखाएंगे?
एलसिमर

ऐसा आमतौर पर इसलिए होता है क्योंकि यह सेवा एक उपयोगकर्ता के रूप में चलती है जो डोमेन व्यवस्थापक या स्थानीय प्रणाली नहीं है (SPN बनाने के लिए आवश्यक है)। डोमेन व्यवस्थापक ने शायद सेटएसपीएन उपयोगिता और उनके डोमेन व्यवस्थापक खाते का उपयोग करके एसपीएन को जोड़ दिया है, ताकि इन मशीनों के लिए डोमेन ऑर्किंट ठीक से काम करे। तो संभावना है, हाँ।
मैट

0

Get-Service -ComputerName * MSSQL * | कहाँ-वस्तु {$ _। स्थिति-एक "चल रहा है"}

जिसे नाम और डिफ़ॉल्ट इंस्टेंसेस मिलना चाहिए। बस अपनी मशीनों की सूची इत्यादि को पुन: व्यवस्थित करें।


-4

बस इसे आज़माया: [System.Data.Sql.SqlDataSourceEnumerator] :: Instance.GetDataSources ()

बहुत अधिक डेटा वापस नहीं आया लेकिन इसने उन सभी sql सर्वरों का पता लगाया जो मेरे पास VM वातावरण में चल रहे हैं।


6
यह विधि पहले से ही थॉमस स्ट्रिंगर के उत्तर में शामिल है ।
एमडीसीसीएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.