J'ai l'impression que c'est surtout ton cerveau qui est trop puissant :p Moi je suis noyé mais je comprends un peu mieux
Je vais me pencher sur les regex dès que j'ai un peu de temps.
Merci beaucoup en tout cas!
J'ai l'impression que c'est surtout ton cerveau qui est trop puissant :p Moi je suis noyé mais je comprends un peu mieux
Je vais me pencher sur les regex dès que j'ai un peu de temps.
Merci beaucoup en tout cas!
Je pensais avoir compris ta regex mais en fait ce n'est pas du tout le cas... Je n'arrive pas à l'adapter pour en faire une plus simple.
Mon problème c'est que le répertoire des profils est plein de cochonneries du type "machin.old" etc. et je voulais (par exemple ici) supprimer tous les .old avant de jouer ton script.
J'ai laissé tomber la regex et j'ai juste fait: Get-ChildItem *.old | Move-Item -Destination et maintenant je me bats avec de problèmes de droits alors que je lance le script en admin du domaine...
Re !
Pour supprimer les vieux machins qui finissent par .old :
Attention cette ligne delete direct !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $profilesPath = 'C:\Users\toto\Desktop\Test' Get-ChildItem $profilesPath | ?{$_.Name -Match '\.old$'} | Remove-Item -Recurse -Force
Merci cerede ne j'avais pas vu ton post mais du coup j'avais édité avec quelque chose qui faisait sensiblement la même chose.
Je n'arrête pas de passer d'un problème à un autre... Là, impossible d'utiliser le script car l'admin du domaine n'a pas les droits sur ces répertoires de profils (ni leur contenu évidemment)...
J'ai trouvé ça mais franchement je n'y comprends pas grand-chose:
J'ai fait le test sur ma machine, ça a bien changé le propriétaire des fichiers contenus dans c:\testdroits mais pas le propriétaire du répertoire lui-même.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 $Target = "c:\testdroits" # Change FOLDER owners to Admin $Folders = @(Get-ChildItem -Path $Target -Directory -Recurse | Select-Object -ExpandProperty FullName) echo $Folders foreach ($Item1 in $Folders) { # Action $AdjustTokenPrivileges = @" using System; using System.Runtime.InteropServices; public class TokenManipulator { [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen); [DllImport("kernel32.dll", ExactSpelling = true)] internal static extern IntPtr GetCurrentProcess(); [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok); [DllImport("advapi32.dll", SetLastError = true)] internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid); [StructLayout(LayoutKind.Sequential, Pack = 1)] internal struct TokPriv1Luid { public int Count; public long Luid; public int Attr; } internal const int SE_PRIVILEGE_DISABLED = 0x00000000; internal const int SE_PRIVILEGE_ENABLED = 0x00000002; internal const int TOKEN_QUERY = 0x00000008; internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; public static bool AddPrivilege(string privilege) { try { bool retVal; TokPriv1Luid tp; IntPtr hproc = GetCurrentProcess(); IntPtr htok = IntPtr.Zero; retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok); tp.Count = 1; tp.Luid = 0; tp.Attr = SE_PRIVILEGE_ENABLED; retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid); retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero); return retVal; } catch (Exception ex) { throw ex; } } public static bool RemovePrivilege(string privilege) { try { bool retVal; TokPriv1Luid tp; IntPtr hproc = GetCurrentProcess(); IntPtr htok = IntPtr.Zero; retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok); tp.Count = 1; tp.Luid = 0; tp.Attr = SE_PRIVILEGE_DISABLED; retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid); retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero); return retVal; } catch (Exception ex) { throw ex; } } } "@ add-type $AdjustTokenPrivileges $Folder = Get-Item $Item1 [void][TokenManipulator]::AddPrivilege("SeRestorePrivilege") [void][TokenManipulator]::AddPrivilege("SeBackupPrivilege") [void][TokenManipulator]::AddPrivilege("SeTakeOwnershipPrivilege") $NewOwnerACL = New-Object System.Security.AccessControl.DirectorySecurity $Admin = New-Object System.Security.Principal.NTAccount("BUILTIN\Administrators") $NewOwnerACL.SetOwner($Admin) $Folder.SetAccessControl($NewOwnerACL) # Add folder Admins to ACL with Full Control to descend folder structure If (Test-Path C:\PTemp) { Remove-Item C:\PTemp } New-Item -type directory -Path C:\PTemp $Acl = Get-Acl -Path C:\PTemp $Ar = New-Object system.security.accesscontrol.filesystemaccessrule("BUILTIN\Administrators","FullControl","Allow") $Acl.SetAccessRule($Ar) Set-Acl $Item1 $Acl } # Change FILE owners to Admin $Files = @(Get-ChildItem -Path $Target -File -Recurse | Select-Object -ExpandProperty FullName) echo $Files foreach ($Item2 in $Files) { # Action $Account = New-Object System.Security.Principal.NTAccount("BUILTIN\Administrators") $FileSecurity = new-object System.Security.AccessControl.FileSecurity $FileSecurity.SetOwner($Account) [System.IO.File]::SetAccessControl($Item2, $FileSecurity) # Add file Admins to ACL with Full Control and activate inheritance If (Test-Path C:\PFile) { Remove-Item C:\PFile } New-Item -type file -Path C:\PFile $PAcl = Get-Acl -Path C:\PFile $PAr = New-Object system.security.accesscontrol.filesystemaccessrule("BUILTIN\Administrators","FullControl","Allow") $PAcl.SetAccessRule($PAr) Set-Acl $Item2 $PAcl } # Clean-up junk rm C:\PTemp rm C:\PFile
J'ai un peu peur de l'exécuter sur le contrôleur de domaine... Ça ne supprime pas les droits des utilisateurs déjà existant?
Vache !!!!!
C'est une usine nucléaire au maïs ton truc
Je regarde ça demain pour te faire un pti truc de modif des droits
Edit : Pas encore eu le temps par contre, en relisant ce que tu as écrit, attention !
Il ne faut pas changer le propriétaire !!
Mais juste rajouter les droits pour l'admin....
De mémoire, je ne sais plus trop, mais il y avait un truc à faire au niveau de la GPO de redirection de profils pour éviter ce problème directement.
Juste pour être sur, tu à tester à la main de te rajouter les droit sur un des dossiers ?
Ca passe ?
Edit2 : Donc pour ajouter le group Admins du domaine aux dossier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 $currACL = Get-Acl <dossier> $nAR = New-Object System.Security.AccessControl.FileSystemAccessRule("Admins du domaine", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow") $currACLl.SetAccessRule($nAR) Set-Acl <dossier> $currACL
Oui c'est sûrement bien compliqué pour ce que ça fait :p
À la main je ne peux pas ajouter les droits au groupe des admins du domaine... C'est pour ça que j'ai voulu changer le propriétaire.
j'ai aussi ce cas bizarre pour ceux que j'ai déplacés à la main : je ne peux pas les supprimer:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Remove-Item : L'accès au chemin d'accès 'E:\Profiles\xxx.V2.old\AppData' est refusé. Au caractère Ligne:1 : 1 + Remove-Item *.old + ~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (E:\Profiles\xxx.V2.old:String) [Remove-Item], Unauthorized AccessException + FullyQualifiedErrorId : RemoveItemUnauthorizedAccessError,Microsoft.PowerShell.Commands.RemoveItemCommand
Merci je vais tester ça
Ah oui si tu ne peux pas à la main mon code ne fonctionnera pas !
Il faut absolument que ta GPO ajoute le droits pour les Admins.
Sinon un jour tu va avoir un gros voir un très gros problème......
Imagine Mr Tartampion quitte la société, on ne sait pour quelle raison son compte AD est supprimé.
Et Mr LeGrandChef viens te voir en disant j'ai besoin d'accéder au donnée de Mr Tartampion qui est parti il y a 2 ans....
Donc toi malin tu as gardé les données précieusement mais comme tu n'as pas les droits Admin sur son dossier, et qu'en fait il n'y a que lui avec son compte AD qui peut y accéder....
Je te laisse imaginer la suite
Donc j'imagine que tu as aussi compris ou je voulais en venir... A ma connaissance tu ne trouvera pas de script pour modifier les droits de ces dossiers !
Et le seul moyen c'est de se logger avec le compte de l'utilisateur et de venir changer les droits
Après tu peux aussi jouer avec un script de logon de ce style :Pour venir ajouter les admins
Code : Sélectionner tout - Visualiser dans une fenêtre à part icacls \\servername\profiles$\%username% /grant administrators:(F) /T
Puis il faudrait impérativement modifier la GPO pour autoriser les admins à y avoir accès !
Je ne sait quelle place tu occupe dans l'entreprise ou tu travail mais si tu n'est pas responsable parles en avec lui
Ben... Je suis en train d'essayer de supprimer des répertoires profils de comptes n'existant plus dans l'AD donc c'est en fait ce qui arrive ici.
Je ne comprends pas pourquoi en rendant le groupe des admins du domaine propriétaire de ces répertoires et leurs sous-répertoires ainsi qu'en ajoutant les droits de contrôle total au groupe des admins du domaine, j'ai encore un message me disant que les autorisations sont insuffisantes. Comment se fait-il que tout ceci ne suffise pas pour obtenir un accès total? Et ensuite pouvoir supprimer ces répertoires et leur contenu.
Je veux bien modifier la GPO en question pour les futurs utilisateurs mais comment faire pour supprimer les données des utilisateurs périmés?
C'est bien la ton problème..... Qui correspond à ce que j'ai décris.
Ça va être très compliqué !
Même GPO modifié cela ne changera pas les existant, elle ne prendra effet que pour les nouveau profils utilisateurs qui seront créés !
Essaye ceci sur un dossier utilisateur test qui ne craint pas au cas ou
Remplace bien sur <DOSSIER_UTILISATEUR> par le chemin du dossier utilisateur => Ex: D:\RoamingProfiles\UserTOTO
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 takeown /R /A /F <DOSSIER_UTILISATEUR> /D Y cacls <DOSSIER_UTILISATEUR> /T /E /P "Administrators":F cacls <DOSSIER_UTILISATEUR> /T /E /P SYSTEM:F cacls <DOSSIER_UTILISATEUR> /T /E /P %1:F
Il est possible que tu est ai besoin de modifier cette ligne :
cacls <DOSSIER_UTILISATEUR> /T /E /P "Administrators":F => cacls <DOSSIER_UTILISATEUR> /T /E /P "Administrateurs":F
Et comme tu est sur un Srv2k12 bien sur si l'UAC est toujours présente tu penses à lancer ton CMD en admin
C'est pas la joie...
J'ai un retour d'erreur incompréhensible:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 takeown : Erreurÿ: Syntaxe incorrecte. La valeur ®ÿyÿ¯ n'est pas autoris‚e pour l'option ®ÿ/dÿ¯. Au caractère Ligne:1 : 1 + takeown /r /a /f "E:\Profiles\xxx.V2.old" /d y + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (Erreurÿ: Syntax...'option ®ÿ/dÿ¯.:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError Entrez "TAKEOWN /?" pour afficher la syntaxe.
Avec et sans guillemets autour du chemin...
Je ne comprends pas qu'avec les droits administrateur en contrôle total on ne puisse pas supprimer ces fichiers, c'est ahurissant...
C'est une mesure de sécurité dans le cas ou l'entreprise considère que les données de chaque utilisateur lui sont propres et que personne à part lui ne doit y avoir accès.
C'est aussi pour cette raison que l'on déconseille vivement de supprimer les comptes AD, mais de simplement les désactiver et de les placer dans une OU spécifique pour ne pas polluer
Edit : Arf oui !!! Système français oblige !!!!
Essaye ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 takeown /R /A /F <DOSSIER_UTILISATEUR> /D O cacls <DOSSIER_UTILISATEUR> /T /E /P "Administrators":F cacls <DOSSIER_UTILISATEUR> /T /E /P SYSTEM:F cacls <DOSSIER_UTILISATEUR> /T /E /P %1:F
Ah ben oui ça passe! :d
Mais j'avais consulté la page d'aide en français: https://technet.microsoft.com/fr-fr/...=ws.10%29.aspx
Et ils mettent "Y" et non pas "O"!
Je vais regarder le reste
Donc normalement maintenant tu à repris le contrôle de tes dossier alors !
Oui ça a l'air beaucoup mieux! Merci cerede
Il y a des répertoires pour lesquels il continue de gueuler... Comme quoi l'accès est refusé.
Vraiment simple à gérer les droits de sécurité Windows
Normalement mes cacls étaient la pour ça
Afin de propager les droits dans les sous-dossiers
J'avoue que je les ai zappés
J'obtiens une erreur comme quoi les arguments sont non valides et une remarque comme quoi il faut utiliser icacls car cacls est désapprouvé.
Edit: C'était à cause des guillemets! Maintenant il dit juste: "Accès refusé."
Oui c'est vrai icacls fait la même chose avec la même syntaxe tu peux remplacer cacls par icacls sans soucis.
Mais ce n'était pas garantie pour cacls !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager