mboost-dp1

PowerShell Mapperettigheder


Gå til bund
Gravatar #1 - mbw2001
12. mar. 2014 16:48
Hej kloge mennesker.

Har prøvet at søge lidt rundt, men kan ikke umiddelbart finde noget som gør det jeg vil.

Jeg skal bruge et script, gerne PowerShell som løber alle undermapper i en mappe i gennem og lister alle mapper / filer som har specifikke rettigheder sat.

Jeg er ikke interesseret i nedarvede rettigheder, kun mapper eller filer som har rettigheder sat specifikt på dem.

Nogen som ligger inde med noget i den stil?
Gravatar #2 - Magten
12. mar. 2014 16:58
Jeg har ikke noget liggende, men vil gerne kigge på det i løbet af et par dage. Det er en meget god øvelse til et overvågningsscript jeg har på min to-do liste :D
Gravatar #3 - mbw2001
13. mar. 2014 15:16
Jeg havde egentlig troet at der ville være nogen som lå inde med noget da det virker oplagt at tjekke disken i gennem for filer med specielle rettigheder.

Men da det ikke lader til at være tilfældet ville det være ret fedt hvis du kunne strikke noget sammen.

Må ærligt indrømme at mine PowerShell evner er lidt begrænsede ;)
Gravatar #4 - mbw2001
17. mar. 2014 07:14
Kigget nærmere på det Magten?

Ellers tænker jeg på at smide det op på Experten eller lignende.
Gravatar #5 - Magten
17. mar. 2014 07:18
Jeg rendte lige ind i en bytur lørdag, så min plan om at kigge på det i weekenden røg i vasken :D

Har tid i aften!
Gravatar #6 - Vandmand
17. mar. 2014 09:18
Jeg er ikke en Powershell haj, men det virker som en overskuelig opgave.

Jeg kan foreslå den her:
http://blogs.technet.com/b/zarkatech/archive/2012/... (der er en kommentar der forklarer hvordan man kun søger på mapper)

Så er det vel bare et spørgsmål om at gennemgå outputtet for den specifikke permission du leder efter? Man må i hvert fald kunne gøre et eller andet med det.

Hvis Magten giver op, kan jeg godt give det et forsøg. :)
Gravatar #7 - mbw2001
17. mar. 2014 20:44
#6
Jeg har fundet en del scripts som gør noget i nærheden. Problemet er egentlig at de alle outputter rettighederne for de forskellige filer hvilket jeg egentlig er ligeglad med (nogle mapper har 7-15 individuelle brugere med specielle rettigheder hvilket er rimelig uoverskueligt).

Det jeg skal bruge er en liste over filer eller mapper som har fået sat specielle rettigheder så jeg bagefter kan gå dem i gennem og fjerne brugerene og i stedet lave nogle fornuftige grupper.
Gravatar #8 - Magten
17. mar. 2014 21:36
Hmm, jeg er ikke frisk nok i låget til at gennemskue det lige nu, har fået lavet lidt men det virker ikke heeeelt efter hensigten. Fortsætter i morgen :)
Gravatar #9 - Magten
20. mar. 2014 18:25
Jeg må nok indrømme at jeg ikke får tid til at lave det færdigt før en gang i næste uge :(

Beklager...
Gravatar #10 - Nextnx
21. mar. 2014 17:41
Nu skal du sikkert bruge den helt forkromet løsning.
Men kan lige smide denne mere simple hvis det nu var nok.

Se / kontroller rettigheder i aktuelle mappe
Get-Acl | fl

Søger efter rettighed på filer/mapper samt i undermapper
Get-ChildItem C:\ -Recurse | Get-Acl | where{$_.accesstostring -like "*ReadAndExecute*"}

Søger efter rettighed på alle mapper samt i undermapper
Get-ChildItem C:\ -Recurse | Where Object{($_.psiscontainer)} | Get-Acl | where{$_.accesstostring -like "*ReadAndExecute*"}
Gravatar #11 - arne_v
22. mar. 2014 19:53
C# forslag:


using System;
using System.IO;
using System.Security.Principal;

namespace E
{
public delegate void CheckDirectory(DirectoryInfo di);
public delegate void CheckFile(FileInfo fi);
public delegate void NoAccess(DirectoryInfo di);
public class Program
{
public static void ProcessDirectory(DirectoryInfo di, CheckDirectory chkdir, CheckFile chkfil, NoAccess na)
{
try
{
chkdir(di);
foreach(FileInfo fi in di.GetFiles())
{
chkfil(fi);
}
foreach(DirectoryInfo newdi in di.GetDirectories())
{
ProcessDirectory(newdi, chkdir, chkfil, na);
}
}
catch(UnauthorizedAccessException)
{
na(di);
}
}
public static void PrintDirNamIfAccessControl(DirectoryInfo di)
{
if(di.GetAccessControl().GetAccessRules(true, false, typeof(NTAccount)).Count > 0 ||
di.GetAccessControl().GetAccessRules(true, false, typeof(SecurityIdentifier)).Count > 0)
{
Console.WriteLine("Access Control: " + di.FullName);
}
}
public static void PrintFileNamIfAccessControl(FileInfo fi)
{
if(fi.GetAccessControl().GetAccessRules(true, false, typeof(NTAccount)).Count > 0 ||
fi.GetAccessControl().GetAccessRules(true, false, typeof(SecurityIdentifier)).Count > 0)
{
Console.WriteLine("Access Control: " + fi.FullName);
}
}
public static void PrintDirNamIfNoAccess(DirectoryInfo di)
{
Console.WriteLine("No Access: " + di.FullName);
}
public static void Main(string[] args)
{
ProcessDirectory(new DirectoryInfo(@"C:\users"), PrintDirNamIfAccessControl, PrintFileNamIfAccessControl, PrintDirNamIfNoAccess);
}
}
}

Gravatar #12 - arne_v
22. mar. 2014 20:21
Og i en multithreaded udgave:


using System;
using System.Collections.Concurrent;
using System.IO;
using System.Security.Principal;
using System.Threading;

namespace E
{
public delegate void CheckDirectory(DirectoryInfo di);
public delegate void CheckFile(FileInfo fi);
public delegate void NoAccess(DirectoryInfo di);
public class MTQ
{
private CheckDirectory chkdir;
private CheckFile chkfil;
private NoAccess na;
private BlockingCollection<DirectoryInfo> queue;
private Thread[] t;
public MTQ(int nthreads, CheckDirectory chkdir, CheckFile chkfil, NoAccess na)
{
this.chkdir = chkdir;
this.chkfil = chkfil;
this.na = na;
queue = new BlockingCollection<DirectoryInfo>();
t = new Thread[nthreads];
for(int i = 0; i < t.Length; i++)
{
t[i] = new Thread(Run);
}
}
public void Start()
{
for(int i = 0; i < t.Length; i++)
{
t[i].Start();
}
}
public void Join()
{
for(int i = 0; i < t.Length; i++)
{
t[i].Join();
}
}
public void Add(DirectoryInfo di)
{
queue.Add(di);
}
public void Run()
{
DirectoryInfo di;
while(true)
{
if(queue.TryTake(out di, 100))
{
Program.ProcessDirectory(di, this, chkdir, chkfil, na);
}
else
{
return;
}
}
}
}
public class Program
{
public static void ProcessDirectory(DirectoryInfo di, MTQ q, CheckDirectory chkdir, CheckFile chkfil, NoAccess na)
{
try
{
chkdir(di);
foreach(FileInfo fi in di.GetFiles())
{
chkfil(fi);
}
DirectoryInfo[] subdirs = di.GetDirectories();
for(int i = 0; i < subdirs.Length; i++)
{
q.Add(subdirs[i]);
}
}
catch(UnauthorizedAccessException)
{
na(di);
}
}
public static void PrintDirNamIfAccessControl(DirectoryInfo di)
{
if(di.GetAccessControl().GetAccessRules(true, false, typeof(NTAccount)).Count > 0 ||
di.GetAccessControl().GetAccessRules(true, false, typeof(SecurityIdentifier)).Count > 0)
{
Console.WriteLine("Access Control: " + di.FullName);
}
}
public static void PrintFileNamIfAccessControl(FileInfo fi)
{
if(fi.GetAccessControl().GetAccessRules(true, false, typeof(NTAccount)).Count > 0 ||
fi.GetAccessControl().GetAccessRules(true, false, typeof(SecurityIdentifier)).Count > 0)
{
Console.WriteLine("Access Control: " + fi.FullName);
}
}
public static void PrintDirNamIfNoAccess(DirectoryInfo di)
{
Console.WriteLine("No Access: " + di.FullName);
}
public static void Main(string[] args)
{
MTQ q = new MTQ(8, PrintDirNamIfAccessControl, PrintFileNamIfAccessControl, PrintDirNamIfNoAccess);
q.Add(new DirectoryInfo(@"C:\users"));
q.Start();
q.Join();
}
}
}


Jeg er dog ikke tilfreds med koden. Det må kunne laves pænere. Men jeg kunne ikke lige få en god ide.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login