Gra*_*old 6 powershell resource-cleanup
在运行时临时将文本存储在powershell变量中时,在不再需要时从内存中删除变量内容的最有效方法是什么?
我已经使用了两者Clear-Item variable:,Remove-Variable但是后者用内容将内存内容与前者置零,从内存中删除的内容有多快?
编辑:我应该让我更清楚为什么要问.
我正在为一堆应用程序虚拟机自动执行RDP登录(应用程序不作为服务运行,外包开发人员,长篇故事).
因此,我正在开发(主要完成)一个脚本,以便将启动会话分组到每个VM.
想法是存储凭据的脚本函数read-host用于提示主机名然后get-credentials获取域/用户/密码.
然后使用256位密钥从安全字符串转换传递(对于存储信用卡并运行组启动的机器/用户唯一的运行时密钥).
VM名称,域,用户和加密的传递存储在文件中.启动会话时,将读入详细信息,密码解密,传递给该VM的cmdkey.exe存储\generic:TERMSRV凭据的详细信息,清除明文传递变量,向该主机启动mstsc,几秒钟后从Windows凭证存储中删除凭据.(如果我将密码作为明文以外的其他任何内容传递给cmdkey.exe,则RDP会话将收到错误或无凭据).
因此,问题是,我需要密码以明文存储在内存中尽可能短的时间.
为了让安全人员满意,脚本本身是aes256加密和ac#包装器,它有自己的ps主机读取,解密和运行脚本,因此运行它的机器上没有明文源.(文件共享上的加密源如此有效,我有一个kill开关,可以简单地用另一个加密脚本替换显示此应用已被禁用的消息)
最有效的方法是让垃圾收集完成它的工作.请记住,Powershell是所有.NET,其着名的内存管理.始终控制范围并确保变量在不需要时立即超出范围.例如,如果循环内部需要临时变量,它们将在循环结束时自动失效,因此无需担心,等等.
编辑:关于你的更新,为什么不$yourPasswordVariable = $null呢?我认为这将更容易理解.它应该是最快的方式.因为Remove-Item并且Clear-Item是一体化的处理程序,他们需要先处理一些东西,然后再确定你真的想要删除一个变量.
我能够确定地清除可变数据/内容的唯一方法是使用以下方法删除当前会话中运行的所有变量:
Remove-Variable -Name * -ErrorAction SilentlyContinue
Run Code Online (Sandbox Code Playgroud)
这会立即删除所有变量.实际上,我将此添加到我的一些脚本的末尾,以便我可以确保运行具有可能相同名称的另一个脚本,不会添加新数据并导致不希望的结果.
DRAWBACK:如果你只需要清除一个变量,这是我几分钟前的情况,那么你需要重新实例化脚本所需的输入变量.
您可以使用秒表来获取命令行开关的执行时间。我认为这两个 cmdlet 之间实际上并没有时间差异。我\xc2\xb4m通常使用“Remove-Item”,因为在我看来,\xc2\xb4s更好地完全删除变量。
\n\n$a = "TestA"\n$b = "TestB"\n$c = "TestC"\n$d = "TestD"\n\n$time = New-Object system.Diagnostics.Stopwatch \n\nStart-Sleep 1\n$time.Start() \n$time.Stop()\n$system = $time.Elapsed.TotalMilliseconds\nWrite-Host "Stopwatch StartStop" $system\n$time.Reset()\n\nStart-Sleep 1\n$time.Start() \nClear-Item Variable:a\n$time.Stop()\n$aTime = $time.Elapsed.TotalMilliseconds - $system\nWrite-Host "Clear-Item in " $aTime\n$time.Reset()\n\nStart-Sleep 1\n$time.Start() \nRemove-Variable b\n$time.Stop()\n$bTime = $time.Elapsed.TotalMilliseconds - $system\nWrite-Host "Remove-Variable in " $bTime\n$time.Reset()\n\nStart-Sleep 1\n$time.Start() \nClear-Item Variable:c\n$time.Stop()\n$cTime = $time.Elapsed.TotalMilliseconds - $system\nWrite-Host "Clear-Item in " $cTime\n$time.Reset()\n\nStart-Sleep 1\n$time.Start() \nRemove-Variable d\n$time.Stop()\n$dTime = $time.Elapsed.TotalMilliseconds - $system\nWrite-Host "Remove-Variable in " $dTime\n$time.Reset()\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
53668 次 |
| 最近记录: |