2012-12-08 14 views
5

रनटाइम पर पावरहेल चर में अस्थायी रूप से टेक्स्ट संग्रहीत करते समय, स्मृति की चर सामग्री को हटाने की सबसे प्रभावी तरीका अब आवश्यकता नहीं होती है?पावरहेल - "साफ़-आइटम परिवर्तनीय:" बनाम "निकालें-परिवर्तनीय"

मैंने Clear-Item variable: और Remove-Variable दोनों का उपयोग किया है, लेकिन पहले के साथ मेमोरी सामग्री को कम करने के बाद मेमोरी से कुछ कितनी जल्दी हटा दिया जाता है?

संपादित करें: मुझे यह थोड़ा स्पष्ट कर देना चाहिए कि मैं क्यों पूछ रहा हूं।

मैं आवेदन वीएम के एक समूह के लिए आरडीपी लॉगिन स्वचालित कर रहा हूं (एप्लिकेशन सेवा, आउटसोर्स डेवलपर्स, लंबी कहानी के रूप में नहीं चलाया जाता है)।

तो, मैं प्रत्येक वीएम में समूह लॉन्च सत्रों के लिए एक स्क्रिप्ट विकसित कर रहा हूं (काफी हद तक समाप्त)।

आइडिया यह है कि क्रेडेंशियल स्टोर करने वाले स्क्रिप्ट फ़ंक्शन read-host का उपयोग होस्टनाम के लिए संकेत देने के लिए get-credentials डोमेन/उपयोगकर्ता/पासवर्ड लेने के लिए करता है।

पास को 256-बिट कुंजी (रनटाइम कुंजी मशीन/उपयोगकर्ता के लिए अद्वितीय है जो क्रेडिट संग्रहित करता है और समूह लॉन्च चलाता है) का उपयोग करके सुरक्षित-स्ट्रिंग से परिवर्तित किया जाता है।

वीएम नाम, डोमेन, उपयोगकर्ता और एन्क्रिप्टेड पास फ़ाइल में संग्रहीत हैं। एक सत्र लॉन्च करते समय, विवरण डिक्रिप्ट किए जाने पर विवरण पढ़े जाते हैं, cmdkey.exe को \generic:TERMSRV को उस वीएम के लिए क्रेडेंशियल स्टोर करने के लिए विवरण स्पष्ट किया गया है, स्पष्ट सादे टेक्स्ट पास वैरिएबल, उस मेजबान को mstsc लॉन्च करें, कुछ सेकंड बाद विंडोज क्रेडेंशियल स्टोर से क्रेडेंशियल हटा दें। (यदि मैंने cmdkey.exe को सादे टेक्स्ट के अलावा कुछ भी पासवर्ड पारित किया है, तो आरडीपी सत्र या तो गलत या कोई प्रमाण-पत्र प्राप्त नहीं होगा)।

तो, इसलिए सवाल है, मुझे पासवर्ड की आवश्यकता है सादे टेक्स्ट में स्मृति में मौजूद होने के लिए जितना संभव हो उतना कम समय के लिए।

सुरक्षा लोगों को खुश रखने के लिए, स्क्रिप्ट स्वयं एएस 256 एन्क्रिप्टेड है और एक सी # रैपर अपने स्वयं के पीएस होस्ट के साथ पढ़ता है, डिक्रिप्ट करता है और स्क्रिप्ट चलाता है, इसलिए मशीन चलाने पर कोई सादा पाठ नहीं है। (फ़ाइल साझाकरण पर एन्क्रिप्टेड स्रोत इतनी प्रभावी ढंग से मेरे पास एक हत्या स्विच है, यह एन्क्रिप्टेड स्क्रिप्ट को किसी अन्य संदेश के साथ प्रतिस्थापित कर सकता है जो इस ऐप को अक्षम कर दिया गया है)

उत्तर

4

आप कमांडलेट के लिए निष्पादन समय प्राप्त करने के लिए स्टॉपवॉच का उपयोग कर सकते हैं। मुझे लगता है कि इन दो cmdlets के बीच वास्तव में एक समय अंतर नहीं है। मैं सामान्य रूप से "निकालें-आइटम" का उपयोग कर रहा हूं क्योंकि मेरी आंखों में एक चर को पूर्ण करने के लिए बेहतर है।

$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() 
+0

मुझे लगता है कि के साथ चारों ओर खेलने जब कार्यालय पर वापस, देखने के लिए मेरे सवाल का संपादित क्यों गति मामलों :-) –

+2

अपने विशेष मामले में मेरी सिफारिश चर अधिलेखित करने के लिए है जाएगा। आप [System.GC] :: संग्रह() के साथ जीसी को ट्रिगर कर सकते हैं लेकिन यह वास्तव में एक अच्छा विचार नहीं है। इसलिए मैं अधिलेखित करने के लिए चर सबसे अच्छा समाधान है :-) – LaPhi

+0

रास्ते जाने के लिए की तरह लगता है लगता है, धन्यवाद :-) –

5

कचरा संग्रह अपना काम करने का सबसे प्रभावी तरीका है। याद रखें, पावरहेल अपने प्रसिद्ध स्मृति प्रबंधन के साथ सभी .NET है। हमेशा अपने दायरे को नियंत्रित करें और सुनिश्चित करें कि जैसे ही उनकी आवश्यकता नहीं है वैरिएबल स्कोप से बाहर हो जाएं। उदाहरण के लिए, यदि अस्थायी चर छोरों के अंदर की जरूरत है, वे पाश के अंत में स्वचालित रूप से अमान्य करेगा ताकि कोई उस के बारे में चिंता करने की आदि

संपादित की जरूरत,: अपने अद्यतन के बारे में, क्यों नहीं बस $yourPasswordVariable = $null करते हैं? मुझे लगता है कि यह समझना बहुत आसान होगा। और यह करने का सबसे तेज़ तरीका होना चाहिए। क्योंकि Remove-Item और Clear-Item सभी एक-एक हैंडलर हैं, उन्हें पहले कुछ सामानों को संसाधित करने की आवश्यकता है, यह निर्धारित करने से पहले कि आप वास्तव में एक चर को मिटाना चाहते हैं।

+0

मैं जब कार्यालय में वापस scoping के साथ चारों ओर खेलने देंगे, क्यों गति मामलों को देखने के लिए मेरे सवाल का संपादित करें देखें :-) –

+1

@ ग्राहमगोल्ड: मेरा संपादन देखें। – Neolisk

+0

कूल, समझ में आता है जब आप स्पष्ट करते हैं कि साफ़-आइटम और निकालें-परिवर्तनीय काम कैसे करें! –

2

दोनों कुशलतापूर्वक .NET ऑब्जेक्ट के "ए" संदर्भ को हटाते हैं।अब यदि वह संदर्भ ऑब्जेक्ट का अंतिम संदर्भ है तो जीसी निर्धारित करेगा कि जब कहा गया ऑब्जेक्ट की स्मृति एकत्र की जाती है। हालांकि, अगर आप नहीं रह चर की जरूरत है तो Remove-Variable का उपयोग भी System.Management.Automation.PSVariable वस्तु के साथ जुड़े स्मृति अंत में रूप में अच्छी तरह एकत्र होने के लिए अनुमति देने के लिए।

+1

मुझे लगता है कि अगर यह जड़ है, तो आप मजबूर कर सकते हैं जीसी एक या अधिक चरों के लिए तुरंत चलाने के लिए और सुनिश्चित करें कि वे स्मृति में किसी भी अब नहीं हैं होने के लिए? यह क्यों महत्वपूर्ण है :-) –

0

समय यह स्क्रिप्ट ब्लॉक और cmdlets चलाने के लिए लेता है मापने के लिए,, Measure-Command

+0

आप बिंदु पूरी तरह से नहीं छूटा है के रूप में जानकारी के लिए संपादित करें देखें - इसके बारे में जल्दी से cmdlet रन नहीं है, लेकिन कितनी जल्दी स्मृति के बाद आदेश निष्पादित किया गया है को मंजूरी दे दी है - नहीं कुछ उपाय के आदेश का आकलन कर सकता। –

5

एक ही रास्ता मैं करने में सक्षम है का उपयोग निश्चितता के साथ, चर डेटा साफ़ करने/सामग्री सभी चर वर्तमान में चल दूर करने के लिए है सत्र का उपयोग कर:

Remove-Variable -Name * -ErrorAction SilentlyContinue 

यह सभी चर तुरंत हटा देता है। असल में, मैं इसे अपनी कुछ स्क्रिप्ट के अंत में जोड़ता हूं, ताकि मैं सुनिश्चित हो सकूं कि संभावित रूप से एक ही नाम के साथ एक और स्क्रिप्ट चलाना, नए डेटा को जोड़ा नहीं जाएगा और अवांछित परिणाम नहीं होंगे।

ड्रैबैक: यदि आपको केवल एक चर की मंजूरी की आवश्यकता है, जो कुछ मिनट पहले मेरे मामले में था, तो आपको अपनी स्क्रिप्ट द्वारा आवश्यक इनपुट चर को फिर से चालू करने की आवश्यकता है।