Назад | Перейти на главную страницу

Где хранятся учетные данные для SQL Management Studio?

Когда мы вошли в SQL Management Studio (используя имя сервера, логин и пароль) с отмеченным флажком «Запомнить пароль». Мне нужно знать, где он хранится на ПК.

Мне нужно отформатировать компьютер. И когда мы установим SQL Management Studio, я потеряю все сохраненные учетные данные. Вот почему мне нужно получить эти файлы для резервного копирования, где он сохраняется.

Предполагая, что вы используете SQL 2008 или более позднюю версию, в окне «Зарегистрированные серверы» щелкните правой кнопкой мыши папку в «DAtabase Engine» и выберите «Задачи», затем «Экспорт». Укажите файл и снимите флажок «Не включать имена пользователей и пароли в файл экспорта». Щелкните ОК. Сохраните этот файл. Когда вы перестроите свою машину, импортируйте файл, и у вас будет все, что было сохранено в этом списке.

Для начала вам нужно зарегистрировать серверы в SSMS. Либо щелкните правой кнопкой мыши сервер в обозревателе объектов и выберите регистр или щелкните правой кнопкой мыши Группы локальных серверов, Выбрать Регистрация нового сервера и выберите имя сервера. Пароль сервера будет заполнен, если они были запомнены ранее. Затем экспортируйте серверы согласно ответу @mrdenny.

А теперь самое сложное. Вам необходимо повторно зашифровать пароли под профилем пользователя на целевой машине. Я подготовил сценарий PowerShell, который может это сделать.

param(
    [Parameter(Mandatory=$true)]
    [string] $FileName,
    [Parameter(Mandatory=$true)][ValidateSet('Decrypt', 'Encrypt')]
    [string] $Operation
)

$ErrorActionPreference = 'Stop'

function Protect-String([string] $clearText)
{
    return [System.Convert]::ToBase64String([System.Security.Cryptography.ProtectedData]::Protect([System.Text.Encoding]::Unicode.GetBytes($clearText), $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser))
}

function Unprotect-String([string] $base64String)
{
    return [System.Text.Encoding]::Unicode.GetString([System.Security.Cryptography.ProtectedData]::Unprotect([System.Convert]::FromBase64String($base64String), $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser))
}

$document = [xml] (Get-Content $FileName)
$nsm = New-Object 'System.Xml.XmlNamespaceManager' ($document.NameTable)
$nsm.AddNamespace('rs', 'http://schemas.microsoft.com/sqlserver/RegisteredServers/2007/08')

$attr = $document.DocumentElement.GetAttribute('plainText')
if ($attr -eq '' -and $Operation -ieq 'Encrypt')
{
    throw "The file does not contain plaintext passwords."
}
if ($attr -ne '' -and $Operation -ieq 'Decrypt')
{
    throw "The file does not contain encrypted passwords."
}

$servers = $document.SelectNodes("//rs:RegisteredServer", $nsm)
foreach ($server in $servers)
{
    $connString = $server.ConnectionStringWithEncryptedPassword.InnerText
    if ($connString -inotmatch 'password="([^"]+)"') {continue}
    $password = $Matches[1]


    if ($Operation -ieq 'Decrypt')
    {
        $password = Unprotect-String $password   
    }
    if ($Operation -ieq 'Encrypt')
    {
        $password = Protect-String $password
    }
    $connString = $connString -ireplace 'password="([^"]+)"', "password=`"$password`""
    $server.ConnectionStringWithEncryptedPassword.InnerText = $connString
}

if ($Operation -ieq 'Decrypt')
{
    $document.DocumentElement.SetAttribute('plainText', 'true')
} 
else 
{
    $document.DocumentElement.RemoveAttribute('plainText')
}
$document.Save($FileName)

На исходной машине запустить .\Move-SqlRegisteredServers.ps1 -FileName 'Your.regsrvr' -Operation Decrypt. Это заменит зашифрованные пароли на простой текст.

На целевой машине запустить .\Move-SqlRegisteredServers.ps1 -FileName 'Your.regsrvr' -Operation Encrypt. Это снова зашифрует пароли с использованием нового ключа.

Теперь вы можете импортировать Your.regsrvr файл в SSMS, и ваши серверы будут вместе с сохраненными учетными данными.

Было бы полезно знать, какая версия SQL Server и в какой ОС вы используете SSMS. При этом для SQL Server 2008 он хранится в найденном файле SqlStudio.bin:

C:\Documents and Settings\<userName>\Application Data\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin

Насколько я понимаю, здесь хранится много других настроек, и простое перемещение этого файла куда-нибудь может сработать, а может и не сработать.

Это, конечно, не сохраняется в виде обычного текста. Если вы не знаете пароль, вам следует просто сбросить его на сервере. Поскольку это сайт для системных администраторов, и вы обязательно читаете Вопросы-Ответы, Я предполагаю, что вы администратор сервера и можете сделать это без проблем.

Ответ - это простая версия, основанная на предыдущих ответах в этом посте с некоторыми необходимыми исправлениями.

Предполагая, что вы используете SQL 2008 или более позднюю версию

Перейдите в Microsoft SQL Server Management Studio, щелкните правой кнопкой мыши любой сервер, к которому вы уже подключились, щелкните "регистр"и выберите сервер, пароль должен быть уже введен, если у вас есть сохраненный пароль для этого сервера. Затем нажмите" Сохранить ". Теперь перейдите в Главное меню -> Просмотр -> Зарегистрированные серверы, вы увидите сервер, который вы только что зарегистрировали, теперь щелкните правой кнопкой мыши нажмите «Задачи» -> «Экспорт», укажите имя файла и снимите флажок «Не включать имя пользователя и пароли в файл экспорта», экспортированный сервер будет иметь расширение, например: «.regsrvr». Теперь, используя следующий сценарий, вы увидите строка подключения расшифрована:

param(
    [Parameter(Mandatory=$true)]
    [string] $FileName
)

Add-Type -AssemblyName System.Security
$ErrorActionPreference = 'Stop'

function Unprotect-String([string] $base64String)
{
    return [System.Text.Encoding]::Unicode.GetString([System.Security.Cryptography.ProtectedData]::Unprotect([System.Convert]::FromBase64String($base64String), $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser))
}

$document = [xml] (Get-Content $FileName)
$nsm = New-Object 'System.Xml.XmlNamespaceManager' ($document.NameTable)
$nsm.AddNamespace('rs', 'http://schemas.microsoft.com/sqlserver/RegisteredServers/2007/08')

$attr = $document.DocumentElement.GetAttribute('plainText')
if ($attr -ne '' -and $Operation -ieq 'Decrypt')
{    
    throw "The file does not contain encrypted passwords."  
}

$servers = $document.SelectNodes("//rs:RegisteredServer", $nsm)

foreach ($server in $servers)
{
    $connString = $server.ConnectionStringWithEncryptedPassword.InnerText
    echo ""
    echo "Encrypted Connection String:"
    echo $connString
    echo ""
    if ($connString -inotmatch 'password="?([^";]+)"?') {continue}
    $password = $Matches[1]

    $password = Unprotect-String $password  
    echo ""
    echo "Decrypted Connection String:"
    $connString = $connString -ireplace 'password="?([^";]+)"?', "password=`"$password`""
    echo $connString
    echo ""
}

Как пользоваться скриптом:

  • Сохраните содержимое скрипта как DecryptConnString.ps1
  • Открыть powershell
  • Введите: ./DecryptConnString.ps1 -FileName 'prod.regsrvr'

Небольшая настройка ответа Dark Daskin, чтобы сделать его совместимым с SSMS 2017 (и новым патчем SSMS2014):

param(
    [Parameter(Mandatory=$true)]
    [string] $FileName,
    [Parameter(Mandatory=$true)][ValidateSet('Decrypt', 'Encrypt')]
    [string] $Operation
)

[System.Reflection.Assembly]::LoadWithPartialName("System.Security") | Out-Null

$ErrorActionPreference = 'Stop'

function Protect-String([string] $clearText)
{
    return [System.Convert]::ToBase64String([System.Security.Cryptography.ProtectedData]::Protect([System.Text.Encoding]::Unicode.GetBytes($clearText), $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser))
}

function Unprotect-String([string] $base64String)
{
    return [System.Text.Encoding]::Unicode.GetString([System.Security.Cryptography.ProtectedData]::Unprotect([System.Convert]::FromBase64String($base64String), $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser))
}

$document = [xml] (Get-Content $FileName)
$nsm = New-Object 'System.Xml.XmlNamespaceManager' ($document.NameTable)
$nsm.AddNamespace('rs', 'http://schemas.microsoft.com/sqlserver/RegisteredServers/2007/08')

$attr = $document.DocumentElement.GetAttribute('plainText')
if ($attr -eq '' -and $Operation -ieq 'Encrypt')
{
    throw "The file does not contain plaintext passwords."
}
if ($attr -ne '' -and $Operation -ieq 'Decrypt')
{
    throw "The file does not contain encrypted passwords."
}

$servers = $document.SelectNodes("//rs:RegisteredServer", $nsm)
foreach ($server in $servers)
{
    $connString = $server.ConnectionStringWithEncryptedPassword.InnerText
    if ($connString -inotmatch 'password="?([^";<]+)"?') {continue}
    $password = $Matches[1]


    if ($Operation -ieq 'Decrypt')
    {
        $password = Unprotect-String $password   
    }
    if ($Operation -ieq 'Encrypt')
    {
        $password = Protect-String $password
    }
    $connString = $connString -ireplace 'password="?([^";<]+)"?', "password=`"$password`""
    $server.ConnectionStringWithEncryptedPassword.InnerText = $connString
}

if ($Operation -ieq 'Decrypt')
{
    $document.DocumentElement.SetAttribute('plainText', 'true')
} 
else 
{
    $document.DocumentElement.RemoveAttribute('plainText')
}
$document.Save($FileName)

Для SSMS v18 вы можете найти его здесь, и на этот раз он доступен для чтения и редактирования человеком:

C:\Users\<userName\AppData\Roaming\Microsoft\SQL Server Management Studio\18.0\UserSettings.xml