在运行时将文本临时存储在powershell变量中时,什么时候不再需要从内存中删除变量内容的最有效方法是什么?

我同时使用了Clear-Item variable:Remove-Variable,但是用后者与从前者清空内存内容相比,从内存中删除内容的速度有多快?

编辑:我应该更清楚我为什么要问。

我正在自动执行一堆应用程序VM的RDP登录(应用程序不能作为服务运行,外包开发人员,长期而言)。

因此,我正在开发(大致完成)一个脚本,以将启动 session 分组到每个VM。

想法是,存储凭据的脚本功能使用read-host提示输入主机名,然后使用get-credentials拾取域/用户/密码。

然后,使用256位 key (存储凭据并运行组启动的机器/用户唯一的运行时 key )从安全字符串转换密码。

VM的名称,域,用户和加密的通行证存储在文件中。启动 session 时,将读取详细信息,解密密码,将详细信息传递给cmdkey.exe以存储该VM的\generic:TERMSRV凭据,清除明文传递变量,将mstsc启动到该主机,几秒钟后从Windows凭据存储中删除该凭据。
(如果我以非明文形式将密码以任何其他方式传递给cmdkey.exe,则RDP session 将收到不正确的凭据或没有凭据)。

因此,因此产生一个问题,我需要以明文形式的密码在内存中存在的时间尽可能短。

为了使安全人员满意,脚本本身是aes256加密的,并且带有自己的ps主机的C#包装程序可以读取,解密和运行该脚本,因此在运行该脚本的计算机上没有纯文本源。 (文件共享上的加密源非常有效,我有一个kill开关,可以简单地将加密脚本替换为另一个显示此应用已被禁用的消息的脚本)

最佳答案

您可以使用秒表来获取小命令的执行时间。我认为这两个cmdlet之间确实没有时差。我通常使用“Remove-Item”,因为在我眼中最好删除一个完整的变量。

$a = "TestA"
$b = "TestB"
$c = "TestC"
$d = "TestD"

$time = New-Object system.Diagnostics.Stopwatch

Start-Sleep 1
$time.Start()
$time.Stop()
$system = $time.Elapsed.TotalMilliseconds
Write-Host "Stopwatch StartStop" $system
$time.Reset()

Start-Sleep 1
$time.Start()
Clear-Item Variable:a
$time.Stop()
$aTime = $time.Elapsed.TotalMilliseconds - $system
Write-Host "Clear-Item in " $aTime
$time.Reset()

Start-Sleep 1
$time.Start()
Remove-Variable b
$time.Stop()
$bTime  = $time.Elapsed.TotalMilliseconds - $system
Write-Host "Remove-Variable in " $bTime
$time.Reset()

Start-Sleep 1
$time.Start()
Clear-Item Variable:c
$time.Stop()
$cTime = $time.Elapsed.TotalMilliseconds - $system
Write-Host "Clear-Item in " $cTime
$time.Reset()

Start-Sleep 1
$time.Start()
Remove-Variable d
$time.Stop()
$dTime  = $time.Elapsed.TotalMilliseconds - $system
Write-Host "Remove-Variable in " $dTime
$time.Reset()

关于Powershell- "Clear-Item variable:"与 "Remove-Variable",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13782788/

10-16 04:54