2016-11-02 10 views
0

Dies ist mein erster Beitrag in Stackoverflow, ich habe seit vielen Jahren viele fantastische Fragen, Antworten und andere verschiedene Beiträge gelesen. Ich habe viel von dieser fantastischen Community gelernt. Ich hoffe jetzt, dass ich den mutigen Schritt getan habe, um wirklich meine Zähne in Powershell zu versenken und mich dieser Gemeinschaft anzuschließen, die ich irgendwie beitragen kann!Powershell: Advanced File Age Suche

Also habe ich begonnen, an einem Projekt zu arbeiten, das auf seiner grundlegenden Kernebene - Liste alle Dateien, die älter als 7 Jahre sind, so dass sie dann überprüfen und löschen können, wo möglich.

Ich habe jedoch das gesamte Skript in mehrere Etappen aufgeteilt. Ich bin derzeit bei einer Stufe in der Stufe 2 stecken.

Ich habe seit etwa 2 Tagen auf was zu viele von Ihnen Powershell-Genie ist da draußen kann nur 10 Minuten, um herauszufinden, stecken!

Ich muss mich entschuldigen für meine Dummheit und Mangel an Wissen, meine Erfahrung mit Powershell-Skripting ist auf buchstäblich 5 Arbeitstage begrenzt, ich bin derzeit tauchen und lernen mit Büchern, aber ich habe auch einen Job, dies zu tun lernen Sie den einfachen Weg!

Mein Skript hat im Wesentlichen 3 Schritte;

  1. Führt eine Get-ACL von obersten DATA-Ordnern aus, um eine Liste aller Gruppen zu erstellen, die über Berechtigungen für einen bestimmten Ordner verfügen. Ich möchte dann entweder diese Daten exportieren oder einfach für den nächsten Schritt halten.

  2. Filtern Sie diese gesammelten Informationen basierend auf einer CSV, die eine Spalte mit der Bezeichnung Rolle enthält (Rolle enthält eine Gruppe, in der der Ordner-Manager exklusiv ist), und prüfen Sie das inhärente Mitglied dieser exklusiven Gruppe (vielleicht muss dieses letzte Bit ein weiterer Schritt auch?)

  3. Speichert oder exportiert diese Liste von exklusiven Mitgliedern mit ihren relevanten Ordner, um später als Variable zu verwenden, um eine E-Mail mit einer Liste von Dateien zu senden, die gelöscht werden müssen.

Mit dem Skript unten ich im Wesentlichen auf Schritt steckte 2 und wie einen Filter aus der CSV (oder gespeicherten Variablen?) Erstellen und es auf die GET-ACL foreach-Schleife. Ich gehe vielleicht den ganzen falschen Weg mit Regex, und um ehrlich zu sein, das meiste davon ist Kopieren und Einfügen und Lesen im Internet, wo Menschen ähnliche Aufgaben erledigt haben. SO entschuldige ich mich nochmal, wenn das von Anfang an nur eine dumme Art ist.

Ich möchte allen im Voraus für alle Hilfe, Meinungen und Ratschläge danken, ich werde alles hören und ich werde versuchen und nehmen an Bord so viel wie mein Gehirn verarbeiten kann - ich verspreche!

#$RoleList = import-csv "C:\DATA\scripts\GB_CMS\CSV\datafolders_rolelist.csv" 
#foreach ($Manager in $RoleList) { 
#$FolderManager = $RoleList.Role 

$FolderManagers = Import-Csv C:\DATA\scripts\GB_CMS\CSV\datafolders_rolelist.csv | foreach { 
    New-Object PSObject -prop @{ 
    Folder = $_.Folder; 
    Manager = $_.'Folder Manager'; 
    Role = $_.Role 


    } 
} 

$Role = $FolderManagers.Role 
$Role 


gci "c:\DATA" | Where {$_.PSIsContainer} | get-acl | 
ForEach $_.Name { 
[regex]$regex="\w:\\\S+" 
$path=$regex.match($_.Path).Value 
$_ | select -expand access | 

$ 

where {$_.identityreference -like "$Role"} | 
Select @{Name="Path";Expression={$Path}},IdentityReference 
} 

Danke, Daniel.

Antwort

0

Etwas raten, was Sie hier wollen. z.B.wenn Sie Ordner haben

C:\Data\Accounts 
C:\Data\Marketing 
C:\Data\Sales 

Sie können Berechtigungen

C:\Data\Accounts {'FolderManagers-Accounts', 'Accounts', 'Directors'} 
C:\Data\Marketing {'FolderManagers-Marketing', 'Marketing', 'Sales'} 
C:\Data\Sales  {'FolderManagers-Sales', 'Sales', 'Directors'} 

und Ihre CSV ist

Name, Role,      Email 
Alice, FolderManagers-Accounts, [email protected] 
Bob, FolderManagers-Marketing, [email protected] 

Und es wird in der CSV eine klare Zuordnung von einer (1) Reihe sein, eine der Gruppen in den ACLs.

Und Sie wollen, von Ihrem Skript:

Identify who to email about "C:\Data\Accounts" 

Wie nah bin ich?

# Import the managers. This will turn the CSV into an array of objects 
# no need to do that explicitly 
$FolderManagers = Import-Csv C:\DATA\scripts\GB_CMS\CSV\datafolders_rolelist.csv 

# This will be a hashtable pairing up folder names with people 
# e.g. 'C:\DATA\Accounts' -> Alice 
$FolderMap = @{} 

# Run through all the folders 
GetChildItem -Path "C:\Data" -Directory | ForEach-Object { 

    # Run through the group/user ACL entries on the folder 
    foreach ($group in (Get-Acl $_.FullName).Access.IdentityReference) 
    { 
     # Look for a matching row in the CSV 
     $CsvRow = $FolderManagers | Where-Object {$_.Role -match $group} 

     if (-not $CsvRow) 
     { 
      Write-Error "No manager found for folder $_" 
     } 
     else 
     { 
      # Add to the map 
      # $_ converts to folder path, C:\DATA\Accounts 
      # $CsvRow is the person, @{Name=Alice, Role=..., Email=...} 
      $FolderMap[$_.FullName] = $CsvRow 
     } 

    } 
} 

Dann ist es (das FolderMap) wird

Name       Value                                  
----       -----                                  
C:\Data\Accounts    {Name='Alice';Role=... 
C:\Data\Marketing    {Name='Bob';Role=... 

Sie es mit

$person = $FolderMap["c:\data\Accounts"] 
$person.email 

sein und wenn Sie es wirklich exportieren, vielleicht wollen abfragen können

$FolderMap | ConvertTo-Json | Set-Content foldermanagers.json 

Nr. Ich habe das meiste von meinem Kopf geschrieben und es wird wahrscheinlich nicht einfach laufen. Und das ist ein Problem mit großen, nicht sehr spezifischen Fragen zu StackOverflow.


Automatisch generierte PS Hilfe Links von meinem Codeblock (falls vorhanden):

+0

Hallo, Vielen Dank für die Antwort und vergib mir für die Verzögerung bei der Reaktion. Ich habe das getestet und wie Sie gesagt haben, hatte ich Probleme, es zu starten. Ich bekomme das Problem mit dieser Linie; # Run durch die Gruppe/Benutzer ACL-Einträge auf den Ordner foreach ($ Gruppe in (Get-Acl $ _) Access.IdentityReference.) Es erzeugt diesen Fehler: Get-Acl: Can not Weg finden ' Folder1 ', weil es nicht existiert. In Zeile: 13 Zeichen: 25 + foreach ($ Gruppe in (Get-Acl $ _). Access.IdentityReference) – danielbostock

+0

Ich werde weiterhin an dem Skript arbeiten heute in dem Versuch herauszufinden, warum Get-ACL ist Der vollständige Pfad der Ordner kann nicht vom vorherigen GCI-Befehl abgerufen werden. Aufgrund meines begrenzten PS-Wissens kann ich es anfangs nicht sehen, werde es aber versuchen und herausfinden, und ich werde meine Antwort aktualisieren, wenn ich es getan habe. – danielbostock

+0

Übrigens ist Ihre Antwort in der Regel recht und hat interpretiert, was ich erreichen möchte, es war sehr hilfreich, besonders bei der Verwendung des foreach-object Befehls, was ich denke, dass das, was Sie zur Verfügung gestellt haben, was ich sein könnte fehlte. – danielbostock