এসকিউএল সার্ভারের পাওয়ারশেল ব্যবহার করে চলমান সমস্ত দৃষ্টান্ত আবিষ্কার করার সবচেয়ে কার্যকর উপায় কী?


13

আমাদের ডোমেনের মধ্যে চলছে এমন এসকিউএল সার্ভারের সমস্ত দৃষ্টান্ত আবিষ্কার করার জন্য আমাকে দায়িত্ব দেওয়া হয়েছিল। বেশ কয়েকটি ক্ষেত্রে সার্ভারে একাধিক উদাহরণ রয়েছে। আমি এই দৃষ্টান্তগুলি খুঁজে পাওয়ার দুটি পৃথক পাওয়ারশেল পদ্ধতি দেখেছি, তবে দুটি উদাহরণই খুঁজে পাওয়া যায় না।

1) ডাব্লুএমআই ব্যবহার করুন

        $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) রিমোট রেজিস্ট্রি ব্যবহার করুন (গেট-এসকিউআইএলস্ট্যান্স 1 এর মতো )

আমি যে সবচেয়ে বড় সমস্যাটি চালাচ্ছি তা হ'ল আমি যে সমস্ত সার্ভারগুলি সম্পর্কে জানি সেগুলি এসকিউএল সার্ভার ডাব্লুএমআই সরবরাহকারীর সাথে চলছে না বা সেগুলি সমস্তই রিমোট রেজিস্ট্রিের অনুমতি দিচ্ছে না। তৃতীয় পদ্ধতি আছে কি? আমি সমস্ত সার্ভারগুলিতে অ্যাক্সেস করতে রিমোট ডেস্কটপ ব্যবহার করতে পারি তবে আমি প্রায় 30 টি মেশিনের দিকে নজর দিচ্ছি এবং সম্ভব হলে ম্যানুয়াল পদক্ষেপগুলি এড়াতে চাই। এটির জন্য কেবল এসকিউএল সার্ভার ২০০৮ এবং উচ্চতরর জন্য কাজ করা দরকার এবং অন্যান্য এসকিউএল সার্ভার পরিষেবাদি (এসএসআইএস / এসএসএএস / এসএসআরএস) সম্পর্কে জেনে রাখা ভাল লাগবে তবে আমার মূল ফোকাস এসকিউএল সার্ভারেই is


উত্তর:


12

আপনি যদি এমন কিছু চান যা ভবিষ্যতের জন্য কার্যকর হবে তবে আমি সম্ভবত রেজিস্ট্রি সন্ধানের চেষ্টা থেকে পরিষ্কার হয়ে উঠব। এসকিউএল সার্ভারের জন্য আমবাতগুলি বছরের পর বছরগুলিতে কিছুটা পরিবর্তিত হয়েছে এবং এটি চালিয়ে যাওয়া কষ্টকর হতে পারে।

এর সাথে সম্পর্কিত পদ্ধতিটি SqlDataSourceEnumeratorমাঝে মাঝে স্বচ্ছ হয় এবং যদিও আমি এটি ব্যবহার করবো তবে নেটওয়ার্কে উদাহরণ রয়েছে তার কোনও দৃ concrete় প্রমাণ নয়। আমি বিশ্বাস করি এটি এসকিউএল ব্রাউজার পরিষেবায়ও নির্ভর করে যা বেশিরভাগ সময় আমি অক্ষম দেখি।

আমি ডাব্লুএমআই ক্লাসটি ব্যবহার করব win32_Service। আমি এটি ব্যবহার করি কারণ এটি Get-Serviceসেমিডলেট এর চেয়ে পরিষেবা সম্পর্কে আরও তথ্য সরবরাহ করে।

আমি সাধারণত সমস্ত কিছু ফাংশন হিসাবে লিখি কারণ আপনি এটি সমস্যা সমাধানের জন্য কেবল দৈনিক চেক বা পরিষেবার যাচাই করতে করতে ব্যবহার করতে পারেন।

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

সম্পাদনা

একটি উল্লিখিত মন্তব্য উপরোক্ত সার্ভার সরবরাহ করা হচ্ছে তালিকার উপর নির্ভর করে। আমাকে সেই তালিকাটি সরবরাহ করা হয়নি এমন ক্ষেত্রে আপনার কাছে কয়েকটি অন্যান্য বিকল্প রয়েছে।

  • যদি আমি একটি অ্যাক্টিভ ডিরেক্টরি পরিবেশে থাকি তবে আমি সেমিডলেট সহ ডোমেনের সমস্ত সার্ভারের একটি তালিকা টানতে পাওয়ারশেলের অ্যাক্টিভ ডিরেক্টরী মডিউলটি ব্যবহার করতে 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চেষ্টা / ক্যাচ ব্লকটি ব্যবহারের জন্য এবং যুক্ত করার জন্য প্রস্তাবিত সম্পাদনাটি কার্যকর হতে পারে এবং বেশিরভাগ ক্ষেত্রে একটি কোড অনুশীলন হয়, আমি এই অতিরিক্ত কোড বা কার্যকারিতা যুক্ত করার জন্য এই ফাংশনটি ব্যবহার করতে চায় এমন ব্যক্তির উপর ছেড়ে দেব। কেবল এগিয়ে যাওয়ার জন্য একটি প্রাথমিক উদাহরণ দেওয়ার চেষ্টা করছি trying SystemNameপ্রকৃত সার্ভারের নাম ফিরিয়ে দেওয়ার তথ্য অন্তর্ভুক্ত করার জন্য আমি আউটপুটটিতে সম্পত্তি যুক্ত করেছি , অন্যান্য ফাংশনে এটি করুন সাধারণত এটি একবারে একাধিক সার্ভারের জন্য ব্যবহার করবেন না যাতে এটি আমার মন কেড়ে যায়।


এটি আপনাকে সরবরাহ করার জন্য সার্ভারগুলির একটি তালিকা সরবরাহ করা শুরু করে। এটি সর্বদা অনুমান করা যায় না।
থমাস স্ট্রিংগার

কেবল স্পষ্টতার জন্য 1433 পোর্টে স্ক্যানিং সীমাবদ্ধ করা কেবলমাত্র নামযুক্ত দৃষ্টান্ত (বা ডিফল্ট উদাহরণগুলির সাথে একটি হার্ড পোর্ট ব্যবহারের জন্য হার্ড-কোডেড) সহ কোনও সার্ভার ছাড়বে। সম্ভবত এটি কোনও বড় বিষয় নয় তবে প্রচুর পরিমাণে অদ্ভুত লোক রয়েছে যারা সেই বন্দরটি বন্ধ করে দিয়েছে port
অ্যারন বারট্র্যান্ড

সত্য, এটি কেবল একটি সূচনা পয়েন্ট। সাধারণত যেখানে পোর্টগুলি সেট করা থাকে আমি ক্লায়েন্টদের দেখেছি তারা সাধারণত সেই সার্ভারগুলি নোট করে থাকে (সে সম্পর্কে সচেতন)। ব্রায়ান কেলির দ্বারা এই পদ্ধতিটি খুঁজে পেয়েছেন তবে এটি চেষ্টা করেননি।

আমি মনে করি রেজিস্ট্রি পদ্ধতি এবং উইন 32_ সার্ভিস ডাব্লুএমআই উভয়কে ফ্যালব্যাক হিসাবে একত্রিত করার ফলে সর্বাধিক সার্ভার পাওয়া উচিত এবং তারপরে বাকীগুলির একটি ম্যানুয়াল অনুসন্ধান কাজ করবে। একটি মনোরম পার্শ্ব প্রতিক্রিয়া হিসাবে, আমি যে পরিষেবাগুলি চলমান তবে প্রয়োজনীয় নয় এমন সার্ভারগুলি যা আমাকে অ্যাক্সেসের অনুমতি দেয় না ইত্যাদি সম্পর্কিত কিছু
তথ্যও টানতে পারি

5

আমি সম্ভাব্য সমস্ত মালিকানাধীন সার্ভার এবং তাদের নির্দিষ্ট নামগুলি না জেনে কোনও পরিবেশ জুড়ে দৃষ্টান্তগুলি আবিষ্কার করার একমাত্র উপায়, হ'ল সিস্টেম.ডাটা.এসএইচএল.এসএইচএলডিটাসোর্সনেমিটার.গেটডাটাসোর্স () কে কল করা যদিও এই পদ্ধতিতে প্রচুর পাদটীকা আসে। এখানে এমএসডিএন উত্স থেকে সরাসরি টানা একটি স্নিপেট রয়েছে:

নেটওয়ার্কে ডেটা উত্সগুলি সনাক্ত করতে স্কেলডাটাসোর্সনেমমেন্টার দ্বারা ব্যবহৃত ব্যবস্থার প্রকৃতির কারণে, পদ্ধতিটি সর্বদা উপলব্ধ সার্ভারগুলির একটি সম্পূর্ণ তালিকা ফেরত দেয় না এবং প্রতিটি কলে তালিকাটি একই রকম নাও হতে পারে। যদি আপনি এই ফাংশনটি ব্যবহার করে ব্যবহারকারীদের একটি তালিকা থেকে একটি সার্ভার নির্বাচন করতে চান, তবে নিশ্চিত হয়ে নিন যে আপনি সর্বদা তালিকায় নেই এমন একটি নাম টাইপ করার জন্য একটি বিকল্প সরবরাহ করেছেন, যদি সার্ভারের গণনা সমস্ত উপলব্ধ সার্ভারগুলি না ফেরায় তবে । তদতিরিক্ত, এই পদ্ধতিটি কার্যকর করতে একটি উল্লেখযোগ্য পরিমাণ সময় নিতে পারে , সুতরাং কর্মক্ষমতা সমালোচনামূলক হলে এটি কল করার বিষয়ে সতর্ক থাকুন।

পাওয়ারশেল থেকে কলটি সহজ:

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

এই পদ্ধতিটি এমন কোনও DataTableবস্তু দেয় যা আপনি সেই অনুযায়ী পরিচালনা করতে পারেন।


3

যদি এসকিউএল ব্রাউজার পরিষেবা সক্রিয় থাকে, আপনি নীচের পাওয়ারশেল কোড সহ এসকিউএল ইনস্ট্যান্সের জন্য পরিষেবাটি জিজ্ঞাসা করতে পারেন। এটি অনুসন্ধানগুলি সম্পাদন করতে নিম্নলিখিত কমান্ডলেটগুলি প্রয়োগ করে:

  • পান-SqlBrowserInstanceList
  • পান-SqlBrowserInstanceInfo
  • পান-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

সম্ভাব্য এসকিউএল উদাহরণগুলি সনাক্ত করার আরেকটি উপায় হ'ল অ্যাক্টিভ ডিরেক্টরিতে তালিকাভুক্ত সার্ভিস প্রিন্সিপাল নামগুলি (এসপিএন)। আপনি যখন উইন্ডোজ প্রমাণীকরণের সাথে এসএমএল সার্ভারের সাথে দূরবর্তীভাবে সংযোগ স্থাপন করেন তখন প্রমাণীকরণের পদ্ধতিতে একটি এসপিএন ব্যবহার করা হয়। এসপিএন এর উপস্থিতির অর্থ এই নয় যে সার্ভার / ইনস্ট্যান্স অবশ্যই আছে এবং চলমান আছে তবে এটি আপনাকে সম্ভাব্য উদাহরণগুলির একটি তালিকা দেয় যা আমি অন্যান্য পদ্ধতির কয়েকটিতে আরও বিস্তৃত বলে খুঁজে পেয়েছি।

জীবনকে আরও সহজ করার জন্য আমি গেট-এসপিএন সেমিডলেট ব্যবহার করি যা থেকে: https://gallery.technet.microsoft.com/scriptcenter/Get-SPN-Get-Service-3bd5524a

Get-SPN.ps1 লিপিটি ডাউনলোড করুন, এটি সি তে সংরক্ষণ করুন: \ পাওয়ারশেল_স্প্রিপ্টস \ get-SPN.ps1 এবং পাওয়ারশেলের মধ্যে নিম্নলিখিতটি চালান:

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

(স্পষ্টতই আপনি স্ক্রিপ্টটি অন্য কোনও স্থানে সংরক্ষণ করতে পারেন, প্রয়োজন অনুযায়ী প্রথম লাইনটি আপডেট করুন))

এটি পরিষেবাটির বন্দর / উদাহরণের সাথে সম্পর্কিত "স্পেসিফিকেশন" সহ বর্তমান ডোমেনে সমস্ত এসকিউএল সার্ভার এসপিএন তালিকাভুক্ত করবে।


আমি লক্ষ্য করেছি যে আমাদের বেশিরভাগ এসকিউএল সার্ভার মেশিনগুলি এসপিএন (বা রক্ষণাবেক্ষণ লগের মধ্যে এমন কিছু সতর্কতা) পেতে অক্ষম। তারা কি এখনও সেই স্ক্রিপ্টটি ব্যবহার করে দেখাবে?
এলসিমার

এটি সাধারণত কারণ পরিষেবাটি এমন কোনও ব্যবহারকারী হিসাবে চলে যা কোনও ডোমেন প্রশাসক বা স্থানীয় সিস্টেম নয় (এসপিএন তৈরি করতে প্রয়োজনীয়)। ডোমেন প্রশাসক সম্ভবত সেটএসপিএন ইউটিলিটি এবং তাদের ডোমেন অ্যাডমিন অ্যাকাউন্ট ব্যবহার করে এসপিএন যুক্ত করেছে, যাতে এই মেশিনগুলির জন্য ডোমেন লেখক সঠিকভাবে কাজ করে। হ্যাঁ, সম্ভবত।
ম্যাট

0

গেট-সার্ভিস-কম্পিউটার নাম * এমএসএসকিউএল * | যেখানে-অবজেক্ট {$ _। স্ট্যাটাস -eq "চলমান"}

এটির নামকরণ এবং ডিফল্ট উদাহরণগুলি পাওয়া উচিত। কেবল আপনার মেশিনের তালিকা ইত্যাদি পুনরাবৃত্তি করুন


-4

এইমাত্র চেষ্টা করেছেন: [System.Data.Sql.SqlDataSourceEnumerator] :: দৃষ্টান্ত.গেটডাটা উত্স ()

প্রচুর ডেটা ফেরত পাওয়া যায়নি তবে এটি ভিএম পরিবেশে আমি যে সমস্ত স্কেল সার্ভারে চলছে তা সনাক্ত করেছে।


6
টমাস স্ট্রিংজারের উত্তরে সেই পদ্ধতিটি ইতিমধ্যে অন্তর্ভুক্ত রয়েছে ।
এমডিপিসিএল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.