PoshCode Logo PowerShell Code Repository

Remove broken NTFS perm by Stephen Wheet 4 years ago (modification of post by Stephen Wheet view diff)
View followups from asdasdasd | diff | embed code: <script type="text/javascript" src="http://PoshCode.org/embed/2081"></script>download | new post

COMMENT: This script was created to find unknown SIDs or old domain permissions on folders. It ignores folders where inheirtance is turned on.

Version 2: completely changed the query method and ACL removal Version 3: Added ability to query AD for servers, and handles getting getting shares automatically from Netapp and Windows servers Version 4: Cleaned up folder checking and added checking for local account checking so we could ignore.
  1. #==========================================================================
  2. # NAME: getunknownsids.ps1
  3. #
  4. # AUTHOR: Stephen Wheet
  5. # Version: 4.0
  6. # Date: 6/11/10
  7. #
  8. # COMMENT:
  9. #       This script was created to find unknown SIDs or old domain permissions
  10. #   on folders.  It ignores folders where inheirtance is turned on.
  11. #
  12. #       This works on NETAPPS and WINDOWS servers.  You will need the DLL's
  13. #
  14. #   Version 2: completely changed the query method and ACL removal
  15. #   Version 3: Added ability to query AD for servers, and handles getting
  16. #              getting shares automatically from:
  17. #             NETAPP FILERS
  18. #             Windows servers
  19. #   Version 4: Cleaned up folder checking and added checking for local
  20. #              account checking so we could ignore.
  21. #
  22. #==========================================================================
  23.  
  24. Function checkshare {
  25.    Param($PassedShareName)
  26.    Process
  27.    {
  28.            
  29.             $path = "\\$serverFQDN\$PassedShareName"
  30.             $filename = $path.Replace("\","-") + ".csv"
  31.  
  32.  
  33.             #Place Headers on out-put file
  34.             $list = "Task,Path,Access Entity,"
  35.             $list | format-table | Out-File "c:\reports\unknownsids\$filename"
  36.  
  37.             #Populate Folders Array
  38.             Write-Host "Writing results to : $filename"
  39.             $date = Get-Date
  40.             Write-Host $date
  41.             Write-Host "Getting Folders in:  $Path"
  42.                         #PSIscontainer means folders only
  43.             [Array] $folders = Get-ChildItem -path $path -recurse | ? {$_.PSIsContainer}
  44.  
  45.  
  46.             #Process data in array
  47.             ForEach ($folder in [Array] $folders)
  48.             {
  49.                 #Check to see if there are any folders
  50.                                 If ($folder.pspath){
  51.                                         #Convert Powershell Provider Folder Path to standard folder path
  52.                                         $PSPath = (Convert-Path $folder.pspath)
  53.                         Write-Host "Checking Dir:  $PSPath"
  54.                        
  55.                                         #Check to make sure valid
  56.                                         If ($PSPath){
  57.                                                 #Get the ACL's from each folder
  58.                                                 $error.clear()
  59.                                 $acl = Get-Acl -Path $PSPath
  60.                                 #Write log if no access
  61.                                                 if (!$?) {
  62.                                 $errmsg = "Error,$PSPath,ACCESS DENIED"
  63.                                 $errmsg | format-table | Out-File -append "$filename"
  64.                                                 } #end IF
  65.                                                
  66.                                 $ACL.Access |
  67.                                                 ?{!$_.IsInherited} |
  68.                                                 ?{ $_.IdentityReference -like $unknownsid -or $_.IdentityReference -like $olddomain } |
  69.                                                 % {$value = $_.IdentityReference.Value
  70.                        
  71.                                 #Check for Local account
  72.                                                         $localsid = 0
  73.                                                         If ($value -like $unknownsid){
  74.                                         $checkforlocal = $value.split("-")
  75.                                         $total =$checkforlocal.count -1
  76.                                         if ($checkforlocal[$total] -match "100?" -or $checkforlocal[$total] -match "500"){
  77.                                                 $localsid = 1
  78.                                                                         # You can uncomment the below if you want to report on local accounts.
  79.                                                                         #$list = ("Local,$PSPath,$value")
  80.                                                                         #$list | format-table | Out-File -append "$filename"
  81.                                                                 }  #end IF
  82.                                 }  #end IF
  83.                                                        
  84.                                 If (!$localsid){
  85.                                     Write-host "Found - $PSPath - $value"
  86.                                                                         $list = ("Found,$PSPath,$value")
  87.                                                 $list | format-table | Out-File -append "$filename"
  88.                                        
  89.                                                                         #Remove Bad SID
  90.                                         if ($removeacl) { $ACL.RemoveAccessRuleSpecific($_)
  91.                                         Write-host "Deleting - $PSPath - $value"
  92.                                         $list = ("Deleting,$PSPath,$value")
  93.                                         $list | format-table | Out-File -append "$filename"
  94.                                                                         }#end IF
  95.                        
  96.                                         if ($removeacl -and $value) {
  97.                                         $date = Get-Date
  98.                                         Write-Host $date
  99.                                         Write-host "Setting - $PSPath"
  100.                                         $list = ("Setting,$PSPath")
  101.                                                 $list | format-table | Out-File -append "$filename"
  102.                                                 Set-ACL $PSpath $ACL
  103.                                                 $value = ""
  104.                                                                         } #end IF
  105.                                 } #end if
  106.                                 } #end foreachobj
  107.                                         } #end if
  108.                                 } #end if      
  109.             } #end ForEach
  110.         }#end Process
  111. } #end function
  112.  
  113. get-pssnapin -registered | add-pssnapin -passthru
  114. [void][Reflection.Assembly]::LoadFile('C:\reports\ManageOntap.dll') #Need this DLL from netapp 3.5SDK
  115. $ReqVersion = [version]"1.2.2.1254"
  116. $QadVersion = (Get-PSSnapin Quest.ActiveRoles.ADManagement).Version  #Need Quest plugins installed
  117.  
  118. if($QadVersion -lt $ReqVersion) {
  119.     throw "Quest AD cmdlets version '$ReqVersion' is required. Please download the latest version"
  120. } #end If
  121.  
  122. #Set variables
  123. $value = ""
  124. $unknownsid = "*S-1-5-21-*" #Broken SID Verify the Broken SID number on your system and replace
  125. $olddomain = "Domain.local*" #Old w2k/nt4 domain
  126. $ErrorActionPreference = "SilentlyContinue"
  127. $removeacl = 0 #change to 1 if you want to remove the SID, 0 for only logging
  128. $localsid = 0
  129.  
  130.  
  131.  
  132. #Get all the servers from the specified OU
  133. $Servers = get-QADComputer -SearchRoot 'domain.local/ou/Server' # change the container.
  134.  
  135. Foreach ($server in $Servers ) {
  136.         $serverFQDN = $server.dnsname
  137.         write-host  $serverFQDN
  138.  
  139.         #Test ping server to make sure it's up before querying it
  140.         $ping = new-object System.Net.NetworkInformation.Ping
  141.         $Reply = $ping.Send($serverFQDN)
  142.     if ($Reply.status -eq "Success"){
  143.         Write-Host "Online"
  144.  
  145.                 #Check for Netapp .. if found get the shares differently           
  146.         If ($serverFQDN -like "*netapp*"){
  147.             $server = new-object netapp.manage.naserver($serverFQDN,1,0)
  148.                        
  149.                         #pass authentication
  150.             $server.Style = "RPC"
  151.                        
  152.                         # Issue command to get the shares
  153.             $NaElement = New-Object NetApp.Manage.NaElement("system-cli")
  154.             $arg = New-Object NetApp.Manage.NaElement("args")
  155.             $arg.AddNewChild('arg','cifs')
  156.             $arg.AddNewChild('arg','shares')
  157.             $NaElement.AddChildElement($arg)
  158.             $CifsString = $server.InvokeElem($NaElement).GetChildContent("cli-output")
  159.                        
  160.                         # Split the returned txt up .. the $null makes it skip a line
  161.             $null,$null,$Lines = $CifsString.Split("`n")
  162.  
  163.             Foreach ($line in $Lines ) {
  164.                                
  165.                 # Had to trick it so skip the line with permissions, then exclude ETC$ adn c$
  166.                                 if (!$line.startswith("                 ") -and $line -notlike "*Etc$*" -and $line -notlike "*C$*"){
  167.                     $l= $line.Split(" ")
  168.                     checkshare -PassedShareName $l[0] #Pass share to function
  169.                 } #end if
  170.             } #end foreach
  171.         } #end if
  172.                
  173.         Else{ #Else if a Windows server query via WMI
  174.                
  175.             Get-WMIObject Win32_Share -Computer $serverFQDN |
  176.                 where {$_.Name -like "*$*" -and $_.Name -notlike "*ADMIN*" -and $_.Name -notlike "*IPC*" -and $_.Name -notlike "*lib*"} |
  177.                                 %{
  178.                         #Set path
  179.                         $sharename = $_.name
  180.                         checkshare -PassedShareName $sharename  #Pass share to function        
  181.                 } #end ForEachObj
  182.         } #End Else
  183.     } #End If
  184. } #end ForEach

Submit a correction or amendment below (
click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:


Remember me