मैं Powershell के माध्यम से IIS APPPOOL \ * खातों के लिए ACL अनुमतियां कैसे जोड़ सकता हूं?


11

मैं नई वेबसाइट्स के लिए अनुमतियों को संशोधित करने के लिए IIS खाते को सेट करने में सक्षम होना चाहता हूं। मेरे पास निम्न स्क्रिप्ट है:

function Set-ModifyPermission ($directory, $username, $domain = 'IIS APPPOOL') {
    $inherit = [system.security.accesscontrol.InheritanceFlags]"ContainerInherit, ObjectInherit"
    $propagation = [system.security.accesscontrol.PropagationFlags]"None"
    $acl = Get-Acl $directory
    $user = New-Object System.Security.Principal.NTAccount($domain, $username )
    $accessrule = New-Object system.security.AccessControl.FileSystemAccessRule($user, "Modify", $inherit, $propagation, "Allow")
    $acl.AddAccessRule($accessrule)
    set-acl -aclobject $acl $directory
}

हालाँकि, जब मैं इसे चलाता हूँ, मुझे इस तरह की त्रुटियाँ मिलती हैं:

सेट-एसीएल: इस कार्य केंद्र और प्राथमिक डोमेन के बीच विश्वास संबंध विफल रहा।

मुझे लगता है कि यह IIS APPPOOLएक वास्तविक डोमेन नहीं है, लेकिन एक तरह के नकली खाते पर एक अजीब उपसर्ग है। क्या उस खाते को संदर्भित करने का कोई सही तरीका है ताकि मैं यह काम कर सकूं?

जवाबों:


12

सबसे पहले, इस तरह सेट-एसीएल का उपयोग करें, क्योंकि निर्देशिका पथ पहला स्थिति संबंधी तर्क है:

Set-Acl $directory $acl

दूसरा, आपको केवल एक तर्क के साथ उपयोगकर्ता ऑब्जेक्ट बनाना चाहिए:

$user = New-Object System.Security.Principal.NTAccount("$domain\\$username")

अद्यतन: ऐसा लगता है कि यह "IIS APPPOOL \ AppPoolName" को NTAccount पहचानकर्ता के रूप में स्वीकार नहीं करेगा। अब, आप जो करने की कोशिश कर रहे हैं, उसे पूरा करने के दो तरीके हैं:

  1. AppPoolIdentities SID के साथ एक नई SID ऑब्जेक्ट बनाएँ और इसे NTAccount में अनुवाद करें, जैसे: http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount.with.html , और आप सक्षम होना चाहिए किसी भी अन्य NTAccount ऑब्जेक्ट की तरह इसका इलाज करने के लिए। यदि आप अभी भी वास्तविक खातों के लिए डोमेन / उपयोगकर्ता नामों को पारित करने में सक्षम होना चाहते हैं, तो कुछ सरल तर्क में बनाया गया है जो AppPool SID के लिए चूक करता है यदि उपयोगकर्ता नाम "AweSomeAppPool" है और डोमेन एक उदाहरण के रूप में खाली है।

  2. Icacls.exe को इनवॉइस करने के लिए PowerShell का उपयोग करें, और जो कुछ भी आप चाहते हैं, उसे अनुदान / निरस्त करने के लिए इसका उपयोग करें, जैसे कि (पहले सामान्य icacls कमांड प्रॉम्प्ट, फिर शक्तियां, अंतर नोटिस):

    icacls.exe test.txt /grant "IIS AppPool\DefaultAppPool":(OI)(CI)M

    cmd /c icacls test.txt /grant "IIS AppPool\DefaultAppPool:(OI)(CI)M"

यदि आप दूसरे विकल्प के लिए जाते हैं, तो पहले उन्हें मैन्युअल रूप से परीक्षण करना सुनिश्चित करें, मुझे खुद इन विशिष्ट उदाहरणों का परीक्षण करने का मौका नहीं मिला है, लेकिन यह काम नहीं करता है


सहायता के लिए धन्यवाद। ऐसा करने पर, मुझे एक अपवाद कॉलिंग मिलती है AddAccessRule: "कुछ या सभी पहचान संदर्भों का अनुवाद नहीं किया जा सकता है।" किसी भी विचार है कि क्या हो सकता है?
bdukes

मुझे यह समझने में मदद करने की कोशिश करें कि आप यहां क्या हासिल करने की कोशिश कर रहे हैं। बात यह है, कि ApplicationPoolIdentities "वास्तविक" एनटी खाते नहीं हैं, वे वास्तव में नेटवर्क्स सेवा के "वर्चुअल अकाउंट" प्रतिनिधित्व की तरह हैं। क्या आप स्थानीय सिस्टम संसाधनों या नेटवर्क संसाधनों पर अनुमतियाँ सेट नहीं करना चाहते हैं? आपकी जरूरत के आधार पर, एक अलग चुनौती पैदा होती है :-)
मथियास आर जेसन

स्थानीय प्रणाली संसाधन। मैं स्‍थानीय विकास वेबसाइटों के लिए सेटिंग को रीसेट / रीसेट करने की कोशिश कर रहा हूं जो मैं सेटअप करता हूं। इसलिए, मैं फ़ाइल सिस्टम के लिए एक वेबसाइट पैकेज खोलना चाहता हूं, इसे IIS में सेट करता हूं, फिर IIS संशोधित अनुमति देने के लिए यह कमांड चलाता हूं। या, साइट में एक अनुमति समस्या में चलाएं, यह सुनिश्चित करने के लिए इसे चलाएं कि साइट बनाने के बाद मैंने जो कुछ जोड़ा है वह अनुमति संशोधित है।
bdukes

बस आपके लिए कुछ उम्मीद से उपयोगी विकल्प जोड़े
Mathias R. Jessen

मैं icaclsमेरे लिए बढ़िया काम कर पा रहा था , मदद के लिए धन्यवाद! मैं समारोह (ऊपर के रूप में ही पैरामीटर) होने का शरीर के साथ समाप्त हो गया cmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q(के साथ /tकाम करने के लिए पुनरावर्ती निर्देशिका पर, /cजा रहा किसी भी त्रुटि के बाद, और रखने के लिए /qप्रत्येक फ़ाइल के लिए दबाने सफलता संदेशों के लिए)।
bdukes

4

कुछ इस तरह से करना चाहिए आपके लिए टोटका यह IIS APPPOOl \ Anything के रूप में अच्छी तरह से हल करने में सक्षम होना चाहिए ...

function Set-AclOnPath
{
    param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string] $Path,

        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string] $DomainAccount
    )

    #Put whatever permission you want here
    $permission = $DomainAccount,"ReadAndExecute","Allow"
    $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission

    $acl = Get-Acl $Path
    $acl.SetAccessRule($accessRule)
    $acl | Set-Acl $Path
}

मुझे एक अपवाद कॉलिंग मिलती है SetAccessRule: "कुछ या सभी पहचान संदर्भों का अनुवाद नहीं किया जा सकता है।"
bdukes

आपके इनपुट क्या थे?
हेथम एबुएलफुथ

Set-AclOnPath .\Website "IIS APPPOOL\website.dev", हालांकि जब मैं इसे फिर से कोशिश करता हूं, तो मुझे एक अलग त्रुटि मिलती है, "इस कार्य केंद्र और प्राथमिक डोमेन के बीच विश्वास संबंध विफल हो गया।"
1

4

IIS साइट के लिए SID प्राप्त करने के लिए Windows 2012 में निम्न कार्य करता है। इसके लिए IIS प्रदाता की आवश्यकता होती है जो WebAdministration powerhell मॉड्यूल का उपयोग करता है, लेकिन यह आलेख इंगित करता है कि यह Windows 2008R2 पर काम करेगा।

$appPoolName = 'MyAppPool'
$appPoolSid = (Get-ItemProperty IIS:\AppPools\$appPool).applicationPoolSid
$identifier = New-Object System.Security.Principal.SecurityIdentifier $appPoolSid
$user = $identifier.Translate([System.Security.Principal.NTAccount])

मैंने इस दृष्टिकोण (विंडोज 8 पर) का उपयोग करने की कोशिश की, लेकिन यह त्रुटि मिली: " AddAccessRule1 'तर्क (ओं) के साथ " अपवाद कॉलिंग " :' कुछ या सभी पहचान संदर्भों का अनुवाद नहीं किया जा सका। ''
bdukes

@ मैथियास आर जेसेन के लिंक का उपयोग करके SID को वास्तविक रूप से अनुवाद करने का उत्तर NTAccount
bdukes

मैंने अनुवाद करने के लिए उत्तर में कोड अपडेट किया है। इसके अलावा, इसका लाभ उठाने की कोशिश करने वालों के लिए, Import-Module WebAdministrationIIS प्रदाता से IIS ड्राइव प्राप्त करने के लिए कॉल करें ।
bdukes

3

IIS 10 / Windows 10 / Server 2016 के रूप में, WebAdministration मॉड्यूल को हटा दिया गया है और हमें इसके बजाय नए IISAdministration Powershell मॉड्यूल का उपयोग करने की उम्मीद है। नए मॉड्यूल का उपयोग करते हुए आभासी उपयोगकर्ता के लिए आवेदन पूल SID का अनुवाद कैसे किया जाए:

Import-Module IISAdministration
$manager = Get-IISServerManager
$appPoolName = 'MyAppPool'
$appPoolSid = $manager.ApplicationPools["$appPoolName"].RawAttributes['applicationPoolSid']
$identifier = New-Object System.Security.Principal.SecurityIdentifier $appPoolSid
$user = $identifier.Translate([System.Security.Principal.NTAccount])

2

विंडोज 2012 में मेरे लिए निम्न कार्य किया गया, अन्य उदाहरण काम नहीं कर सके:

Import-Module WebAdministration

$appPoolName='MyAppPool'
$folderDirectory='C:\MyWebFolder'

$appPoolSid = (Get-ItemProperty IIS:\AppPools\$appPoolName).applicationPoolSid

Write-Output "App Pool User $appPoolSid"

$identifier = New-Object System.Security.Principal.SecurityIdentifier $appPoolSid
$user = $identifier.Translate([System.Security.Principal.NTAccount])

Write-Output "Translated User $user.Value"

$acl = Get-Acl $folderDirectory
$acl.SetAccessRuleProtection($True, $False)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($user,”FullControl”, ContainerInherit, ObjectInherit”, None”, Allow”)
$acl.AddAccessRule($rule)
$acl | set-acl -path $folderDirectory

यह भी मेरे लिए एक बात को छोड़कर काम किया। इसने अन्य सभी अनुमतियां हटा दीं। यदि यह वह नहीं है जो आप चाहते हैं, तो इस पंक्ति पर टिप्पणी करें $acl.SetAccessRuleProtection($True, $False)क्योंकि यहाँ अंतिम परम सुरक्षित है। इसे पोस्ट करने के लिए धन्यवाद!
कुर्तियां
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.