我的目标是创建一个批处理文件,每次执行时执行 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"
希望对你有帮助!