SQL Management Studio 的凭据保存在哪里?

SQL Management Studio 的凭据保存在哪里?

当我们登录 SQL Management Studio(使用服务器名称、登录名和密码)并选中“记住密码”时。我需要知道它在 PC 中的保存位置。

我需要格式化我的电脑。当我们安装 SQL Management Studio 时,我将丢失我保存的所有凭据。这就是为什么我需要获取该文件以将其保存在哪里进行备份。

答案1

了解 SQL Server 的版本以及您在哪个操作系统上运行 SSMS 会很有帮助。也就是说,对于 SQL Server 2008,它存储在以下 SqlStudio.bin 文件中:

%appdata%\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin

据我了解,这里存储了许多其他设置,只需将该文件移动到某个地方,可能会或可能不会对您有用。

答案2

答案是一个基于此帖先前答案的简单版本,并进行了一些必要的修复。

假设你正在运行 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'

答案3

首先,您需要在 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 并将您的服务器与保存的凭据放在一起。

答案4

它肯定不是以纯文本形式保存的。如果您不知道密码,则应在服务器上重置密码。由于这是一个面向系统管理员的网站,您肯定会阅读常问问题,我假设您是服务器的管理员,并且可以毫无问题地执行此操作。

相关内容