आनुभविक परिणाम
मैंने कुछ PowerShell लिखा, जो एक डिटेक्शन स्क्रिप्ट के रूप में चलने पर, पर्यावरण चर को डंप करता है जो कि डिटेक्शन स्क्रिप्ट लॉग फ़ाइल में देखता है। वह स्क्रिप्ट इस उत्तर के अंत में है।
मैं तब SCCM क्लाइंट द्वारा अलग-अलग "इंस्टॉलेशन बिहेवियर" और "लॉगऑन आवश्यकता" पैरामीटर के साथ एक परिनियोजन प्रकार को तैनात करके इस स्क्रिप्ट को चलाने का कारण बनता हूं। परिणाम नीचे दी गई तालिका में हैं:
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
कंप्यूटर के नाम हैं
विश्लेषण
उपरोक्त परिणाम आश्चर्यचकित करने वाले हैं क्योंकि संदर्भ जो कि एक स्क्रिप्ट का पता चलता है, भाग पर निर्भर करता है कि अनुप्रयोग उपयोगकर्ता या सिस्टम पर तैनात किया गया था या नहीं। यह पर्याप्त आश्चर्य था कि मैंने दूसरी बार परीक्षण चलाए। परिणाम लगातार थे।
हम उपरोक्त तालिका से निम्नलिखित परिकल्पनाओं को अस्थायी रूप से आकर्षित कर सकते हैं:
- जब कोई अनुप्रयोग किसी उपयोगकर्ता के लिए लागू किया जाता है, तो उस अनुप्रयोग के लिए एक PowerShell खोज स्क्रिप्ट उस उपयोगकर्ता के रूप में चलाई जाती है।
- जब किसी अनुप्रयोग को सिस्टम में तैनात किया जाता है और सिस्टम के लिए परिनियोजन प्रकार स्थापित किया जाता है, तो उस अनुप्रयोग के लिए एक PowerShell खोज स्क्रिप्ट सिस्टम के रूप में चलाई जाती है।
- जब किसी अनुप्रयोग को एक सिस्टम पर तैनात किया जाता है और उपयोगकर्ता के लिए परिनियोजन प्रकार स्थापित किया जाता है, तो उस अनुप्रयोग के लिए एक PowerShell खोज स्क्रिप्ट लॉग-इन उपयोगकर्ता के रूप में चलाई जाती है।
उपरोक्त तीन परिकल्पनाओं को परीक्षण के परिणामों का समर्थन है। कुछ अन्य चर भी हो सकते हैं जिनका परीक्षण नहीं किया गया था जहाँ ये परिकल्पनाएँ नहीं हैं। वे कम से कम, PowerShell डिटेक्शन स्क्रिप्ट का उपयोग करते समय प्रारंभिक मान्यताओं का एक अच्छा सेट हैं।
बेमेल संबंध (खबरदार!)
जेसन सैंडिस ने अधिष्ठापन संदर्भ के नियमों के समान परीक्षण का दस्तावेजीकरण किया। यदि आप उस पोस्ट को ध्यान से पढ़ते हैं, तो आप देख सकते हैं कि इंस्टॉलेशन संदर्भ और स्क्रिप्ट स्क्रिप्ट का पता लगाने के नियम समान नहीं हैं। यहाँ आपत्तिजनक नियम हैं:
जब एक एप्लिकेशन का इंस्टॉलेशन व्यवहार "सिस्टम के रूप में इंस्टॉल करें" पर सेट होता है, तो इंस्टॉलर को सिस्टम के रूप में चलाया जाता है [उपयोगकर्ता की तैनाती की परवाह किए बिना]।
जब कोई एप्लिकेशन किसी उपयोगकर्ता के लिए तैनात किया जाता है, तो उस एप्लिकेशन के लिए एक PowerShell खोज स्क्रिप्ट उस उपयोगकर्ता के रूप में चलाई जाती है [चाहे स्थापना व्यवहार "सिस्टम के रूप में स्थापित करें" पर सेट हो]।
इसका मतलब यह है कि एक एप्लिकेशन जिसमें इंस्टॉलेशन व्यवहार "सिस्टम के रूप में इंस्टॉल करें" और एक उपयोगकर्ता संग्रह में तैनात है, इंस्टॉलेशन के लिए सिस्टम संदर्भ का उपयोग करेगा, लेकिन पता लगाने के लिए उपयोगकर्ता संदर्भ।
किसी ऐसे व्यक्ति के लिए, जहां इंस्टॉलेशन बिहेवियर "सिस्टम के रूप में इंस्टॉल हो" के लिए डिटेक्शन राइटिंग डिटेक्शन सिस्टम और उपयोगकर्ता संदर्भों के बीच परिवर्तन करने वाले पर्यावरण के किसी भी हिस्से पर भरोसा करने से बचने के लिए सावधान रहना चाहिए। अन्यथा, सिस्टम संग्रह में तैनात किसी अनुप्रयोग का पता लगाना सफल हो सकता है, जबकि उपयोगकर्ता संग्रह में तैनात ठीक उसी अनुप्रयोग का पता लगाना विफल रहता है।
लिपि
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)
}