2013-02-15 43 views
5

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

मेरी समस्या यह है कि मुझे अनुमति सेट नहीं मिल सकता है।

नीचे दिए गए कोड में, my_fileServer फ़ाइल सर्वर का नाम है; एसएसओ का मतलब सिंगल-साइन-ऑन आईडी है, जो नीचे दिए गए टेस्ट कोड में "user9999" पर सेट है।

किसी भी मदद की बहुत सराहना की जाती है!

Set-Variable homeDir -option Constant -value "\\my_fileServer\Users" 
Set-Variable sso -option Constant -value "user9999" 

# If the folder for the user does not exist, make a new one and set the correct permissions. 
if ((Test-Path "$homeDir\$sso") -eq $false) 
{ 
    try 
    { 
     $NewFolder = New-Item -Path $homeDir -Name $sso -ItemType "Directory" 
     $Rights = [System.Security.AccessControl.FileSystemRights]"FullControl,Modify,ReadAndExecute,ListDirectory,Read,Write" 
     $InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None 
     $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None 
     $objType =[System.Security.AccessControl.AccessControlType]::Allow 
     $objUser = New-Object System.Security.Principal.NTAccount "my_full_domain_name\$sso" 
     $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ` 
       ($objUser, $Rights, $InheritanceFlag, $PropagationFlag, $objType) 
     $ACL = get-acl -Path $NewFolder 
     $ACL.AddAccessRule($objACE) 
     $objReturn = Set-ACL -Path "$homeDir\$sso" -AclObject $ACL 
    $objReturn 
    } 
    catch 
    { 
     $msg = $_ 
     $msg 
    } 
} 

घर फ़ोल्डर ठीक हो गया है, लेकिन जब मैं उपयोगकर्ता के लिए अनुमतियों की जांच करता हूं, तो कोई बॉक्स नहीं लगाया जाता है। enter image description here

+0

सेट-एसीएल कोई मूल्य नहीं लौटाता है। –

उत्तर

6

समस्या आपकी विरासत है। आप सबफ़ोल्डर और फ़ाइलों (उनके फ़ोल्डर में मौजूद वस्तुओं) पर विरासत में विरासत प्राप्त करने की अनुमति नहीं दे रहे हैं। यही कारण है कि आप मूल सुरक्षा विंडो में अनुमतियां (केवल "विशेष अनुमति") नहीं देखते हैं। यदि आप "उन्नत सुरक्षा सेटिंग्स" खोलते हैं तो आप देखेंगे कि उपयोगकर्ता के पास इस फ़ोल्डर पर पूर्ण नियंत्रण है, न कि सामग्री। जब तक आप CREATOR स्वामी के लिए अनुमतियां (विरासत के साथ) जोड़ते हैं, तो मालिक को वस्तुओं पर पहुंच मिलती है, मुझे लगता है कि आप ठीक होंगे। हालांकि, अगर आप यह पहले से ही अब इस तरह ठीक हो सकते हैं:

$InheritanceFlag = @([System.Security.AccessControl.InheritanceFlags]::ContainerInherit,[System.Security.AccessControl.InheritanceFlags]::ObjectInherit) 

जब तक विशेष आवश्यकताओं हैं, तो आप उन अपने फ़ोल्डर (पूर्ण विरासत) पर पूर्ण पहुँच देना चाहिए। तय विरासत के साथ पूर्ण समाधान (मैं भी अपने Set-ACL पथ साफ और अनावश्यक returnobject हटाया):

try 
{ 
    $NewFolder = New-Item -Path $homeDir -Name $sso -ItemType "Directory" 
    $Rights = [System.Security.AccessControl.FileSystemRights]"FullControl,Modify,ReadAndExecute,ListDirectory,Read,Write" 
    $InheritanceFlag = @([System.Security.AccessControl.InheritanceFlags]::ContainerInherit,[System.Security.AccessControl.InheritanceFlags]::ObjectInherit) 
    $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None 
    $objType =[System.Security.AccessControl.AccessControlType]::Allow 
    $objUser = New-Object System.Security.Principal.NTAccount "my_full_domain_name\$sso" 
    $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ` 
      ($objUser, $Rights, $InheritanceFlag, $PropagationFlag, $objType) 
    $ACL = Get-Acl -Path $NewFolder 
    $ACL.AddAccessRule($objACE) 
    Set-ACL -Path $NewFolder.FullName -AclObject $ACL 
} 
+0

आपको बहुत बहुत धन्यवाद !! अब मैं समझता हूं क्यों .. – user1866880

0

सभी अनुमतियां ठीक 'Special Permmissions' के रूप में स्थापित कर रहे हैं, तो आप Advanced पर क्लिक जाँच करें और 'प्राधिकरण' टैब पर देख सकते हैं।

2

मैं दुर्भाग्य से वोट नहीं कर सकता, लेकिन मैं इसके बाद के संस्करण (Graimer और सीबी), वास्तविक जवाब दोनों जवाब से सहमत दोनों का संयोजन है।
- आपको "उन्नत" विंडो
में अनुमतियों की जांच करने की आवश्यकता है - भले ही आपका कोड "काम करता है", विरासत के बिना, आपके उपयोगकर्ता आपके द्वारा निर्दिष्ट फ़ोल्डर में बहुत कुछ करने में सक्षम नहीं होंगे।

0

इसे सरल रखें, इसे कम करें ... आप जो चूक गए हैं वह SetAccessRuleProtection फ़ंक्शन है।

यहां वह कोड है जो आपको इच्छित टिकटें देगा।

if (-not (Test-Path "$homeDir\$sso")) 
{ 
    $acl = Get-Acl (New-Item -Path $homedir -Name $sso -ItemType Directory) 

    # Make sure access rules inherited from parent folders. 
    $acl.SetAccessRuleProtection($false, $true) 

    $ace = "$domain\$sso","FullControl", "ContainerInherit,ObjectInherit","None","Allow" 
    $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($ace) 
    $acl.AddAccessRule($objACE) 
    Set-ACL -Path "$homeDir\$sso" -AclObject $acl 

}