Когда мы вошли в 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 ""
}
Как пользоваться скриптом:
Небольшая настройка ответа 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