অভিজ্ঞতামূলক ফলাফল
আমি কিছু পাওয়ারশেল লিখেছিলাম যা যখন সনাক্তকরণ স্ক্রিপ্ট হিসাবে চালানো হয় তখন পরিবেশের ভেরিয়েবলগুলি ডাম্প করে যা সনাক্তকরণ স্ক্রিপ্টটি লগ ফাইলটিতে দেখায়। এই স্ক্রিপ্টটি এই উত্তরের শেষে রয়েছে।
আমি তখন এই স্ক্রিপ্টটি এসসিসিএম ক্লায়েন্ট দ্বারা বিভিন্ন "ইনস্টলেশন আচরণ" এবং "লগন প্রয়োজনীয়তা" পরামিতি সহ একটি ডিপ্লোয়মেন্ট টাইপ মোতায়েন করে চালিত করি। ফলাফলগুলি নীচে সারণিতে রয়েছে:
Test InstallationBehavior LogonRequirement DeployedTo LoggedOnUser ScriptRunAs
---- -------------------- ---------------- ---------- ------------ -----------
1.1a Install for user Only when a user is logged on un2 un2 un2
1.1b Install for user Only when a user is logged on cn1 un2 un2
1.1c Install for user Only when a user is logged on cn1 un1 un1
1.2a Install for system Only when a user is logged on un2 un2 un2
1.2b Install for system Only when a user is logged on cn1 un2 cn1
1.2c Install for system Only when a user is logged on cn1 un1 cn1
1.3a Install for system Whether or not a user is logged on un2 un2 un2
1.3b Install for system Whether or not a user is logged on cn1 un2 cn1
1.3c Install for system Whether or not a user is logged on cn1 un1 cn1
unX
ব্যবহারকারীর নাম
cnX
কম্পিউটার নাম
বিশ্লেষণ
উপরের ফলাফলগুলি অবাক করে দেয় কারণ একটি সনাক্তকরণ স্ক্রিপ্টটি যে প্রসঙ্গে চালিত হয়েছে তা অ্যাপ্লিকেশনটি কোনও ব্যবহারকারী বা সিস্টেমে স্থাপন করা হয়েছিল কিনা তার উপর নির্ভর করে। এটি একটি আশ্চর্যের যথেষ্ট ছিল যে আমি দ্বিতীয়বার পরীক্ষাগুলি চালিয়েছি। ফলাফল ধারাবাহিক ছিল।
আমরা উপরের সারণি থেকে অস্থায়ীভাবে নিম্নলিখিত অনুমানগুলি আঁকতে পারি:
- যখন কোনও অ্যাপ্লিকেশন কোনও ব্যবহারকারীর কাছে স্থাপন করা হয়, তখন সেই অ্যাপ্লিকেশনটির জন্য পাওয়ারশেল সনাক্তকরণ স্ক্রিপ্টটি সেই ব্যবহারকারী হিসাবে চালিত হয়।
- যখন কোনও অ্যাপ্লিকেশন কোনও সিস্টেমে স্থাপন করা হয় এবং সিস্টেমের জন্য স্থাপনার ধরণ ইনস্টল করা হয়, তখন সেই অ্যাপ্লিকেশনটির জন্য একটি পাওয়ারশেল সনাক্তকরণ স্ক্রিপ্ট সিস্টেম হিসাবে চালিত হয় is
- যখন কোনও অ্যাপ্লিকেশন কোনও সিস্টেমে স্থাপন করা হয় এবং ব্যবহারকারীর জন্য স্থাপনার ধরণ ইনস্টল করা থাকে, তখন সেই অ্যাপ্লিকেশনটির জন্য একটি পাওয়ারশেল সনাক্তকরণ স্ক্রিপ্ট লগ-ইন করা ব্যবহারকারী হিসাবে চালিত হয় is
উপরের তিনটি অনুমান পরীক্ষার ফলাফল দ্বারা সমর্থিত। আরও কিছু ভেরিয়েবল থাকতে পারে যা পরীক্ষা করা হয়নি যেখানে এই অনুমানগুলি রাখা হয় না। এগুলি পাওয়ারশেল সনাক্তকরণ স্ক্রিপ্টগুলি ব্যবহার করার সময় অন্ততপক্ষে প্রাথমিক অনুমানের একটি ভাল সেট।
মেলানো প্রসঙ্গ (সাবধান!)
জেসন স্যান্ডিস ইনস্টলেশনের প্রসঙ্গে নিয়মের অনুরূপ পরীক্ষার নথিভুক্ত করেছেন। আপনি যদি সেই পোস্টটি মনোযোগ সহকারে পড়েন তবে আপনি লক্ষ্য করতে পারেন যে ইনস্টলেশন প্রসঙ্গে এবং সনাক্তকরণের স্ক্রিপ্ট প্রসঙ্গে নিয়মগুলি এক রকম নয়। আপত্তিজনক নিয়মগুলি এখানে:
যখন কোনও অ্যাপ্লিকেশনটির ইনস্টলেশন আচরণটি "সিস্টেম হিসাবে ইনস্টল করুন" তে সেট করা থাকে তখন ইনস্টলারটি সিস্টেম হিসাবে চালিত হয় [ব্যবহারকারীকে নির্বিশেষে]
যখন কোনও অ্যাপ্লিকেশন কোনও ব্যবহারকারীর কাছে স্থাপন করা হয়, তখন সেই অ্যাপ্লিকেশনটির জন্য পাওয়ারশেল সনাক্তকরণ স্ক্রিপ্টটি সেই ব্যবহারকারী হিসাবে চালিত হয় [ইনস্টলেশন আচরণ "সিস্টেম হিসাবে ইনস্টল করুন" সেট করা নির্বিশেষে]।
এর অর্থ হ'ল এমন একটি অ্যাপ্লিকেশন যার ইনস্টলমেন্ট আচরণ রয়েছে "সিস্টেম হিসাবে ইনস্টল করুন" এবং ব্যবহারকারীর সংগ্রহে নিযুক্ত করা হয়েছে সেগুলি ইনস্টলেশনের জন্য সিস্টেমের প্রসঙ্গটি ব্যবহার করবে তবে সনাক্তকরণের জন্য ব্যবহারকারী প্রসঙ্গটি ব্যবহার করবে।
অ্যাপ্লিকেশনগুলির জন্য সনাক্তকরণ স্ক্রিপ্টগুলি লেখার ক্ষেত্রে যেখানে ইনস্টলেশন আচরণ "সিস্টেম হিসাবে ইনস্টল করুন" সিস্টেম এবং ব্যবহারকারীর প্রেক্ষাপটের মধ্যে পরিবর্তিত পরিবেশের যে কোনও অংশের উপর নির্ভর করা এড়াতে সতর্কতা অবলম্বন করা উচিত। অন্যথায়, কোনও সিস্টেম সংগ্রহের জন্য নিযুক্ত অ্যাপ্লিকেশন সনাক্তকরণ সফল হতে পারে যখন কোনও ব্যবহারকারী সংগ্রহের জন্য নিযুক্ত ঠিক একই অ্যাপ্লিকেশনটি ব্যর্থ হয়।
লিপি
function Write-EnvToLog
{
$appName = 'script-detect-test'
$logFolderPath = "c:\$appName-$([System.Environment]::UserName)"
if ( -not (Test-Path $logFolderPath -PathType Container) )
{
New-Item -Path $logFolderPath -ItemType Directory | Out-Null
}
if ( -not (Test-Path $logFolderPath -PathType Container ) )
{
return
}
$logFileName = "$appName`__$((Get-Date).ToString("yyyy-MM-dd__HH-mm-ss")).txt"
$fp = "$logFolderPath\$logFileName"
Get-ChildItem Env: | Out-File $fp | Out-Null
return $true
}
try
{
if ( Write-EnvToLog ) { "Detected!" }
[System.Environment]::Exit(0)
}
catch
{
[System.Environment]::Exit(0)
}