我有一个困境。
我正在尝试在Windows中设置一个计划任务,该计划任务将PowerShell脚本作为另一个用户(具有访问但没有登录权限的服务帐户)运行。问题是我们的安全组已告知我们不使用密码编码(显然是很好的建议),但SQL的连接字符串似乎需要以纯文本形式提供。我通过创建密码文件来解决这个问题:
$credential = Get-Credential
$credential.Password | ConvertFrom-SecureString | Set-Content e:\temp\password.txt
然后在脚本中将其转换回纯文本(用于连接字符串)
$password = cat E:\temp\password.txt | ConvertTo-SecureString
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$UnsecurePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
$connectionString = "Data Source=<mydatabase>;Initial Catalog='<mytable>';User ID=tng ;Password=$Unsecurepassword;"
但是,问题在于,当我创建密码文件并像我一样运行脚本时,它工作得很好,但我似乎无法将其作为计划任务运行。在过去的经验中,我已经看到了运行计划任务的服务帐户可能需要创建密码文件的位置,但是没有本地登录权限,我不知道如何创建它。有什么想法吗?
我尝试了this technet article,但似乎仍需要从其他帐户进行本地登录。
答案 0 :(得分:0)
找到答案 - 我需要在安全字符串中添加一个密钥:
创建文件时 - 添加$ key:
[byte[]] $key = (1..16)
$credential = Get-Credential
$credential.Password | ConvertFrom-SecureString -key $key | Set-Content e:\temp\password.txt
然后再读回来:
$passwordfile = "E:\temp\password.txt"
[byte[]] $key = (1..16)
$securePassword = Get-Content $passwordfile | ConvertTo-SecureString -Key $key
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($securepassword)
$UnsecurePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
找到答案