如何保护批处理文件(PowerShell 内部)中的 SQL 凭据以使用 sqlcmd 运行脚本

如何保护批处理文件(PowerShell 内部)中的 SQL 凭据以使用 sqlcmd 运行脚本

我的目标是创建一个批处理文件,每次执行时执行 SQL (express) DB 备份。但我不想在该批处理中存储清晰的密码。

使用 PowerShell,我成功创建了一个安全的 txt 文件,其中存储了纯文本加密的 SQL 所需的密码:

'MyPassword' | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "C:\TEST\dbSecure.txt"

我轻松地在批处理中设置了 %SERVER% 和 %USER% 变量

SET SERVER=localhost\instance_name
SET USER=toto

我的问题是我想从 securestring 中获取明文(使用 PowerShell 命令),然后将其设置为批处理中的 %PASSWORD% 变量:根据互联网上的建议和类似问题,我尝试了这个

REM Powershell to create a $Password variable - its secure value is stored in dbSecure.txt
powershell -command " $SecurePassword = Get-Content 'C:\TEST\dbSecure.txt' | ConvertTo-SecureString "

进而

FOR /F "tokens=*" %%F IN (powershell -noninteractive -command " ($UnsecurePassword = (New-Object PSCredential "user",$SecurePassword).GetNetworkCredential().Password) ") DO (
    SET PASSWORD=%%F
)

...但它不起作用

所以我尝试了这个方法

FOR /F "tokens=* USEBACKQ" %%F IN (`powershell -command " ([System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::
SecureStringToBSTR($Password)^)^) " `) DO (
    SET PASSWORD=%%F
)

…但它也不起作用。

我的批次的结束是合乎逻辑的

sqlcmd -I -S %SERVER% -U %USER% -P %PASSWORD% -i "C:\TEST\backup_database.sql"

当然,我在代码或理解上搞砸了一些事情。有人知道我该如何处理吗?

答案1

我做到了 !!! 我分享了我的发现(我会一直使用这段代码,直到找到更好的方法,就像 @PhilW 在他的评论中所建议的那样)。这对你们很有帮助:

在 PowerShell 控制台上,键入

'MyP@ssW0rd' | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "C:\TEST\dbSecure.txt"

现在使用以下命令清除 PowerShell 命令历史记录

[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()

您可以将 dbSecure.txt 设置为隐藏文件。在用于 sqlcmd 备份执行的批处理中,我使用了来自 @Papa smurf (2018 年 7 月) 的现有问题/答案,并对其进行了自定义,如下所示:

FOR /F "tokens=*" %%P IN (' Powershell -command " (New-Object PSCredential "toto",(Get-Content C:\TEST\dbSecure.txt | ConvertTo-SecureString)).GetNetworkCredential().Password"') DO SET PASSWORD=%%P

然后,在批处理脚本中,可以使用以下代码:

@ECHO OFF
SET SERVER=localhost\my_instance
SET USER=toto

FOR /F "tokens=*" %%P IN (' Powershell -command " (New-Object PSCredential "toto",(Get-Content C:\TEST\dbSecure.txt | ConvertTo-SecureString)).GetNetworkCredential().Password"') DO SET PASSWORD=%%P

sqlcmd -I -S %SERVER% -U %USER% -P %PASSWORD% -i "C:\TEST\backup_db.sql"

希望对你有帮助!

相关内容