{"version":"1.1","schema_version":"1.1.0","plugin_version":"1.1.2","url":"https://tutos-gameserver.fr/2020/05/04/rechercher-et-verrouiller-les-autorisations-de-partage-windows-laxistes-bien-choisir-son-serveur-d-impression/","llm_html_url":"https://tutos-gameserver.fr/2020/05/04/rechercher-et-verrouiller-les-autorisations-de-partage-windows-laxistes-bien-choisir-son-serveur-d-impression/llm","llm_json_url":"https://tutos-gameserver.fr/2020/05/04/rechercher-et-verrouiller-les-autorisations-de-partage-windows-laxistes-bien-choisir-son-serveur-d-impression/llm.json","manifest_url":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","language":"fr-FR","locale":"fr_FR","title":"Rechercher et verrouiller les autorisations de partage Windows laxistes\n\n &#8211; Bien choisir son serveur d impression","site":{"name":"Tutos GameServer","url":"https://tutos-gameserver.fr/"},"author":{"id":1,"name":"Titanfall","url":"https://tutos-gameserver.fr/author/titanfall/"},"published_at":"2020-05-04T20:39:00+00:00","modified_at":"2020-05-04T20:39:00+00:00","word_count":2298,"reading_time_seconds":690,"summary":"Garder vos données en sécurité et à l&#39;abri des utilisateurs non autorisés est une tâche complexe, qui peut être encore plus difficile si un paramètre par défaut dans Windows vous gêne. Essayer de sécuriser les autorisations de partage Windows est un gros défi en raison d&#39;un paramètre appelé contournement de la vérification qui vérifie que [&hellip;]","summary_points":["Garder vos données en sécurité et à l&#39;abri des utilisateurs non autorisés est une tâche complexe, qui peut être encore plus difficile si un paramètre par défaut dans Windows vous gêne.","Essayer de sécuriser les autorisations de partage Windows est un gros défi en raison d&#39;un paramètre appelé contournement de la vérification qui vérifie que le système d&#39;exploitation est activé par défaut.","Ce paramètre donne accès aux dossiers même si l&#39;utilisateur n&#39;a de droits d&#39;accès à aucun de ses parents.","Nous pouvons supprimer cette autorisation avec le paramètre d&#39;objet de stratégie de groupe, mais elle est là pour une raison."],"topics":["Serveur d'impression"],"entities":[],"entities_metadata":[{"id":10,"name":"Serveur d'impression","slug":"serveur-dimpression","taxonomy":"category","count":3907,"url":"https://tutos-gameserver.fr/category/serveur-dimpression/"}],"tags":["Serveur d'impression"],"content_hash":"a5c638c7cff45c78ed08c9cc357fbba5","plain_text":"Garder vos données en sécurité et à l&#39;abri des utilisateurs non autorisés est une tâche complexe, qui peut être encore plus difficile si un paramètre par défaut dans Windows vous gêne.\nEssayer de sécuriser les autorisations de partage Windows est un gros défi en raison d&#39;un paramètre appelé contournement de la vérification qui vérifie que le système d&#39;exploitation est activé par défaut. Ce paramètre donne accès aux dossiers même si l&#39;utilisateur n&#39;a de droits d&#39;accès à aucun de ses parents.\nNous pouvons supprimer cette autorisation avec le paramètre d&#39;objet de stratégie de groupe, mais elle est là pour une raison. Sans ce paramètre activé, vous constaterez une baisse importante des performances car Windows vérifiera chaque dossier parent pour voir si l&#39;utilisateur est autorisé à accéder à la cible.\nCet article explique comment créer un rapport sur les autorisations de partage Windows pour déterminer quels utilisateurs ont des autorisations excessives et comment le réparer à l&#39;aide de PowerShell et de Sysinternals.\n\nRassembler les partages de fichiers et leurs utilisateurs autorisés\nTout d&#39;abord, nous devons trouver les partages de fichiers sur les serveurs et les systèmes clients. Nous pourrions le faire soit en utilisant le Get-SmbShare    ou en appelant l&#39;espace de noms win32_share à l&#39;aide de Get-CimInstance    ou Get-WmiObject.\nPour cet exemple, Get-WmiObject    est le moyen préféré de récupérer nos actions, car il s&#39;agit d&#39;une approche plus rationalisée. Lancez le terminal PowerShell en tant qu&#39;administrateur sur un serveur de fichiers et entrez la commande suivante:\nGet-WMIObject -Class win32_shareNom Chemin Description    ---- ---- -----------    MyShare C:  demo  share Partage de démonstration                    ADMIN $ C:  Administrateur distant WINDOWS   C C:                                               C $ C:  Partage par défaut  D $ D:  Partage par défaut  E $ E:  Partage par défaut  IPC $ IPC distant     imprimer $ C:  WINDOWS  system32  spool  drivers Pilotes d&#39;imprimantescripts C:  scripts\nLa commande PowerShell génère tous les partages, mais elle ne montre pas aux utilisateurs qui y ont accès. En effet, les autorisations de partage Windows résident dans un autre espace de noms appelé Win32_LogicalShareSecuritySetting:\nGet-WmiObject -Class Win32_LogicalShareSecuritySetting\nCette sortie résultante ne nous dit pas grand-chose non plus. Nous avons besoin d&#39;un script PowerShell plus complet pour générer quelque chose de plus utile:\n# Obtenez tous les partages sur l&#39;ordinateur    $ Shares = Get-WMIObject -Class win32_share    # Variable aux actions traitées.    $ NetworkShares = [System.Collections.Generic.List[PSCustomObject]]::Nouveau()    # Ignorez les partages par défaut en filtrant &#39;2147483648&#39;    foreach ($ Part en $ Actions |? $ _. Tapez -ne &#39;2147483648&#39; -et $ _. Nom -ne &#39;print $&#39;) {            # Créez un objet que nous retournerons            $ ShareObject = [PSCustomObject]@                     Nom = $ Share.Name                    Description = $ Share.Description                    LocalPath = $ Share.Path                    ACL = [System.Collections.ArrayList]::Nouveau()                        # Obtenez les paramètres de sécurité pour le partage            $ ShareSecurity = Get-WmiObject -Class Win32_LogicalShareSecuritySetting -Filter &quot;name = &#39;$ ($ Share.Name)&#39;&quot; &quot;            # Si des paramètres de sécurité existent, créez une liste avec les ACL            if ($ Null -ne $ ShareSecurity)                     Essayer                              $ SecurityDescriptor = $ ShareSecurity.GetSecurityDescriptor (). Descriptor                                          foreach ($ AccessControl dans $ SecurityDescriptor.DACL)  Out-Null                                                        # Renvoyer l&#39;objet de partage avec les ACL                            $ NetworkShares.Add ($ ShareObject)                                        Capture                            Erreur d&#39;écriture $ Erreur[0]                                            Autre                     Write-Information &quot;Aucune autorisation trouvée pour $ ($ Share.Name) sur $ ComputerName&quot;                }\nLe contenu du $ NetworkShares    La variable devrait finir par ressembler à ce qui suit:\nPS51&gt; $ NetworkSharesNom Description LocalPath ACL                                                                                                         ---- ----------- --------- ---                                                                                                         DemoShare Demo share C:  demo  share System.Security.AccessControl.FileSystemAccessRule                                                        scripts C:  scripts System.Security.AccessControl.FileSystemAccessRule, System.Security.AccessControl.FileSystemAccessRule    PS51&gt; $ NetworkShares[0].ACL    FileSystemRights: FullControl    AccessControlType: Autoriser    IdentityReference: Tout le monde    IsInherited: False    InheritanceFlags: Aucun    PropagationFlags: Aucun\nNous avons réussi à collecter des données sur nos autorisations de partage Windows, montrant qui a accès à quoi. Cela peut ne pas être suffisant car les administrateurs attribuent généralement des autorisations de partage réseau au niveau NTFS, pas au niveau du partage réseau.\nNous devons également vérifier les fichiers et dossiers du partage s&#39;il existe des autorisations excessives pour d&#39;autres groupes, tels que Tout le monde ou Utilisateurs de domaine.\n\n\nAnalyse des autorisations de fichiers à l&#39;aide d&#39;AccessChk\nNous avons une liste de nos partages de fichiers. Ensuite, nous devons obtenir toutes les autorisations de fichier. La méthode la plus rapide consiste à utiliser l&#39;utilitaire de fichiers AccessChk de la suite Sysinternals et à analyser la sortie avec PowerShell.\nPlacez AccessChk sur votre serveur de fichiers et copiez le fichier AccessChk64.exe dans votre dossier system32. Vous pouvez télécharger l&#39;utilitaire à partir du lien ci-dessus ou utiliser le code PowerShell suivant pour le télécharger et le copier dans votre dossier system32:\nInvoke-WebRequest -OutFile $ env: TEMP  AccessChk.zip -Uri https://download.sysinternals.com/files/AccessChk.zip     Expand-Archive -Path $ env: TEMP  AccessChk.zip -DestinationPath $ env: TEMP -Force    Copy-Item -Path $ env: TEMP  AccessChk64.exe C:  Windows  System32  AccessChk64.exe\nNous pouvons utiliser PowerShell pour créer une fonction wrapper autour d&#39;AccessChk à utiliser dans un script:\nFonction Invoke-AccessChk {            param (                    $ Path,                    $ Directeurs,                    $ AccessChkPath = &quot;$ env: windir  system32  accesschk64.exe&quot;,          [switch]$ Répertoires          [switch]$ AcceptEula                      )            # Accepter le CLUF             if ($ AcceptEula)                     &amp; $ AccessChkPath / accepteula             $ Argument = &quot;uqs&quot;            if ($ DirectoriesOnly)                     $ Argument = &quot;udqs&quot;                        $ Output = &amp; $ AccessChkPath -nobanner - $ Argument $ Path                  Foreach ($ Row dans $ Output)                     # Si c&#39;est une ligne avec un chemin de fichier, sortez l&#39;objet précédent et créez-en un nouveau                    if ($ Row -match &quot;^  S&quot;)                             If ($ Null -ne $ Object)                                     if ($ Object.Access.Keys.Count -gt 0)                                             $ Object                                                                                            $ Object = [PSCustomObject]@                                     Chemin = $ Ligne                                    Accès = @                                                                     # S&#39;il s&#39;agit d&#39;une ligne avec des autorisations                    if ($ Row -match &quot;^  [R ][W ]&quot;) &quot;))                                     $ Row -match &quot;^ (?[R ]) (?[W ]) (?. *) &quot;                                            # Si c&#39;est la dernière ligne - sortez l&#39;objet une fois de plus            if ($ Object.Access.Keys.Count -gt 0)                     $ Object                }\nNous pouvons maintenant courir Invoke-AccessChk    avec les partages réseau stockés dans le $ NetworkShares    variable de l&#39;étape précédente. Nous ajoutons à une liste des principaux de sécurité &#8211; sans &quot;domaine&quot; &#8211; pour trouver:\n# Invoke-AccessChk ne sortira que les fichiers / dossiers où les principaux suivants ont l&#39;autorisation:    $ RiskPrincipals = @ (            &#39;Toutes les personnes&#39;,            «Utilisateurs du domaine»,            «Ordinateurs de domaine»,            &#39;Utilisateurs authentifiés&#39;,            &#39;Utilisateurs&#39;    )    $ RiskyPermissions = Foreach ($ NetworkShare in $ NetworkShares | Select -First 1) ? $ _ -In $ RiskPrincipals)                  if ($ RiskPrincipalExist)                     Invoke-AccessChk -Path $ NetworkShare.LocalPath -Principals $ RiskPrincipals                \nle $ RiskyPermissions    La variable donnera une sortie similaire à ceci:\nPS51&gt; $ RiskyPermissions    Accès au chemin                                               ---- ------                                               C:  demo  share  File1.txt BUILTIN  Users, NT AUTHORITY  Authenticated Users    C:  demo  share  Folder1  picture.png AUTORITÉ NT  Utilisateurs authentifiés                   C:  demo  share  Folder1  Folder2 AUTORITÉ NT  Utilisateurs authentifiés    PS51&gt; $ RiskyPermissions[0].Accès\n\n\nCréation d&#39;un rapport à partir de plusieurs ordinateurs et serveurs\nJusqu&#39;à présent, vous pouvez obtenir une liste de tous les partages de fichiers et vérifier tous les fichiers avec le wrapper PowerShell pour Invoke-AccessChk. L&#39;une des nombreuses forces de PowerShell est sa capacité à évoluer. La communication à distance PowerShell portera le code que nous avons produit au niveau supérieur pour recueillir les informations de plusieurs ordinateurs à la fois.\nTout d&#39;abord, nous avons besoin d&#39;une liste d&#39;ordinateurs et de serveurs à analyser. Si possible, le moyen le plus simple consiste à utiliser le module Active Directory de RSAT:\n$ Computers = (Get-ADComputer -Filter *). DnsHostName\nCette méthode n&#39;est peut-être pas une option dans les environnements plus vastes fortement segmentés. Une autre approche consiste à obtenir des données de votre base de données de gestion de configuration ou à les saisir manuellement à l&#39;aide de l&#39;exemple suivant:\n$ Ordinateurs = @ (            &#39;Server1&#39;,            «Server2»,            «Server3»,            «Server4»,            «Server5»,        «PC1»        # etc    )\nIl est maintenant temps de lier tous ces composants dans un script qui utilise des travaux d&#39;arrière-plan PowerShell pour effectuer les actions suivantes sur les machines spécifiées dans le $ Ordinateurs paramètre:\n\nObtenez tous les partages partagés avec l&#39;un des principaux dans $ RiskPrincipals.\nTéléchargez AccessChk s&#39;il n&#39;existe pas déjà.\nVérifiez l&#39;autorisation NTFS de tous les partages rassemblés par AccessChk.\nRenvoyer un objet avec une liste avec tous les fichiers où les principaux de sécurité dans $ RiskPrincipals    avoir des autorisations de lecture ou d&#39;écriture.\n\nL&#39;ordinateur exécutant le script collectera ensuite les résultats de tous les travaux et les affichera dans un fichier CSV portant le nom ShareAccessReport.\nN&#39;oubliez pas d&#39;exécuter ce qui suit en tant qu&#39;administrateur sur un ordinateur disposant d&#39;un accès réseau auxdites machines et d&#39;accepter le CLUF pour AccessChk en modifiant $ AcceptEula    à vrai:\n$ Ordinateurs = @ (            «Serveur-1»,            «Serveur-2»,            «PC-1»    )    # Accepter le CLUF pour AccessChk    # CHANGER EN VRAI    $ AcceptEula = $ false    if (! $ AcceptEula)             Write-Warning &quot;N&#39;a pas accepté le CLUF pour AccessChk, ne peut pas continuer&quot;        Pause        # Principaux que nous voulons rechercher    $ RiskPrincipals = @ (            &#39;Toutes les personnes&#39;,            «Utilisateurs du domaine»,            «Ordinateurs de domaine»,            &#39;Utilisateurs authentifiés&#39;,            &#39;Utilisateurs&#39;    )    # Liste des partages que nous voulons ignorer.    # Définir un nom de partage lié juste au cas où, car il devrait presque toujours être ce chemin    $ IgnoreShares = @ (            &#39;print $&#39;    )    # Scriptblock que nous enverrons avec Invoke-Command    $ Scriptblock = {            $ RiskPrincipals = $ args[0].RiskPrincipals            $ IgnoreShares = $ args[1].IgnoreShares            $ AcceptEula = $ args[2].AccepterEula            # Fonctions pour télécharger et utiliser AccessChk            # Il utilise un objet shell au lieu de Expand-Archive pour une compatibilité descendante            Fonction Download-AccessChk                     param (                            $ Url = &quot;https://download.sysinternals.com/files/AccessChk.zip&quot;,                            $ Dest = $ env: temp                    )                    if (Test-Path &quot;$ dest  accesschk.zip&quot;)                             rm $ Dest  AccessCHK.zip -Force                                        (New-Object System.Net.WebClient) .DownloadFile ($ url, &quot;$ env: temp  AccessChk.zip&quot;)                    $ Shell = New-Object -ComObject Shell.Application                    $ Zip = $ shell.NameSpace (&quot;$ env: temp  AccessChk.zip&quot;)                    $ Destination = $ shell.NameSpace (&quot;$ env: windir  system32 &quot;)                    $ copyFlags = 0x00                    $ copyFlags + = 0x04                    $ copyFlags + = 0x10                    $ Destination.CopyHere ($ Zip.Items (), $ copyFlags)                        # La fonction qui utilise accesschk de la partie 2            Fonction Invoke-AccessChk {                    param (                            $ Path,                            $ Directeurs,                            $ AccessChkPath = &quot;$ env: windir  system32  accesschk64.exe&quot;,              [switch]$ Répertoires              [switch]$ AcceptEula                              )                    if (! (Test-Path &quot;$ env: windir  system32  accesschk64.exe&quot;))                             Download-AccessChk                                        # Accepter le CLUF                     if ($ AcceptEula)                             &amp; $ AccessChkPath / accepteula                     $ Argument = &quot;uqs&quot;                    if ($ DirectoriesOnly)                             $ Argument = &quot;udqs&quot;                                        $ Output = &amp; $ AccessChkPath -nobanner - $ Argument $ Path                          Foreach ($ Row dans $ Output)                             # Si c&#39;est une ligne avec un chemin de fichier, sortez l&#39;objet précédent et créez-en un nouveau                            if ($ Row -match &quot;^  S&quot;)                                     If ($ Null -ne $ Object)                                             if ($ Object.Access.Keys.Count -gt 0)                                                     $ Object                                                                                                                    $ Object = [PSCustomObject]@                                             Chemin = $ Ligne                                            Accès = @                                                                                             # S&#39;il s&#39;agit d&#39;une ligne avec des autorisations                            if ($ Row -match &quot;^  [R ][W ]&quot;) &quot;))  Out-Null                                                                      $ Object.Access[$Matches.Principal] = @                                                     Read = $ Matches.Read -eq &#39;R&#39;                                                    Write = $ Matches.Read -eq &#39;W&#39;                                                                                                                                                    # Si c&#39;est la dernière ligne - sortez l&#39;objet une fois de plus                    if ($ Object.Access.Keys.Count -gt 0)                             $ Object                                }            # Obtenez tous les partages en utilisant WMI            $ Shares = Get-WmiObject -Class win32_share            # Créez un objet que nous reviendrons plus tard lorsque nous aurons terminé            $ ReturnObject = [PSCustomObject]@                     ComputerName = $ ComputerName                    NetworkShares = [System.Collections.Generic.List[PSCustomObject]]::Nouveau()                    AccessibleObjects = @                         # Ignorez les partages par défaut en filtrant &#39;2147483648&#39;            # Ignorer les parts de $ IgnoreShares            foreach ($ Part en $ Actions |? $ _. Tapez -ne &#39;2147483648&#39; |? $ _. Nom -notin $ IgnoreShares) {                    $ ShareObject = [PSCustomObject]@                             Nom = $ Share.Name                            Description = $ Share.Description                            LocalPath = $ Share.Path                            ACL = [System.Collections.ArrayList]::Nouveau()                                        $ ShareSecurity = Get-WMIObject -Class Win32_LogicalShareSecuritySetting -Filter &quot;name = &#39;$ ($ Share.Name)&#39;&quot; &quot;                    if ($ Null -ne $ ShareSecurity) {                            Essayer                                      $ SecurityDescriptor = $ ShareSecurity.GetSecurityDescriptor (). Descriptor                                                  foreach ($ AccessControl dans $ SecurityDescriptor.DACL)  Out-Null                                                                        # Ajouter un partage réseau uniquement s&#39;il contient un utilisateur / groupe à risque                                                  $ Match = $ False                                    Foreach ($ IdentityReference dans $ ShareObject.ACL.IdentityReference.Value)                                             Foreach ($ Pattern in $ RiskPrincipals)                                                     if ($ IdentityReference -Match $ Pattern)                                                                            $ Match = $ True                                                                                                                                                                        if ($ Match)                                             $ ReturnObject.NetworkShares.Add ($ ShareObject)                                                                            Autre                                             Write-Verbose &quot;Aucune correspondance pour les groupes à risque, n&#39;ajoutant pas&quot;                                                                                                             Capture                                    Erreur d&#39;écriture $ Erreur[0]                                                }                    Autre                             Write-Information &quot;Aucune autorisation trouvée pour $ ($ Share.Name) sur $ ComputerName&quot;                                        }            # Obtenez tous les fichiers de NetworkShares où un principal de $ RiskPrincipals a un accès en lecture ou en écriture            $ ReturnObject.NetworkShares | Pour chaque                     $ ReturnObject.AccessibleObjects[$_.Name] = Invoke-AccessChk -Path $ _. LocalPath -Principals $ RiskPrincipals -AcceptEula: $ AcceptEula                        # Terminé! Permet de renvoyer l&#39;objet de retour:            $ ReturnObject    }    # À ajouter à la liste d&#39;arguments d&#39;Invoke-Job car le travail PowerShell distant n&#39;a pas accès à notre espace variable.    $ InvokeParam = @             RiskPrincipals = $ RiskPrincipals            IgnoreShares = $ IgnoreShares            AcceptEula = $ AcceptEULA        # Commencer les travaux    $ Job = Invoke-Command -AsJob -ComputerName $ Computers -ArgumentList $ InvokeParam -ScriptBlock $ Scriptblock    # Attendez la fin des travaux    $ Job | Wait-Job    # Collecte des données de tous les travaux    $ Output = Get-Job | Receive-Job    # Sortie de la sortie dans un CSV    $ ToCSV = Foreach ($ Résultat dans $ Output) {            Foreach ($ Entrez $ Result.AccessibleObjects.Keys)  Sélectionnez @ Name = &#39;ShareName&#39;; Expression = $ Key, Path, $ ReadAccess, $ WriteAccess                }    # Exporter le CSV    $ ToCSV | Export-Csv -Path.  ShareAccessReport.csv\nLorsque le travail PowerShell se termine, il crée un rapport complet de l&#39;accès des principaux dans le $ RiskyPrincipals    variable.\n\n\nCorrection des autorisations de partage Windows\nAprès avoir examiné le CSV et trouvé les autorisations qui doivent être ajustées, il existe deux façons de les corriger. S&#39;il n&#39;y en a que quelques-uns, le meilleur moyen est d&#39;utiliser l&#39;interface graphique. Mais s&#39;il y en a des milliers, la commande suivante utilisera la sortie CSV pour accélérer cela:\n# Cela doit s&#39;exécuter localement sur le serveur avec le partage de fichiers.    $ UserToRemove = &#39;Invité&#39;    $ CSV = Import-Csv -Path.  ShareAccessReport.csv | ?     $ CSV | ? $ _. ComputerName -eq $ env: COMPUTERNAME | Pour chaque             $ ACL = Get-Acl -Path $ _. Path            $ ACL.Access \nCe script PowerShell supprimera toutes les autorisations du principal de sécurité invité.\nLe premier rapport apportera généralement beaucoup de travail car il découvrira beaucoup de bizarreries et de risques en ce qui concerne vos autorisations de partage Windows. Mais la gestion régulière d&#39;une solution comme celle-ci, spécialement destinée aux partages contenant des informations sensibles, sera finalement payante.\n\nClick to rate this post!\r\n                                   \r\n                               [Total: 0  Average: 0]","paragraphs":["Garder vos données en sécurité et à l&#39;abri des utilisateurs non autorisés est une tâche complexe, qui peut être encore plus difficile si un paramètre par défaut dans Windows vous gêne.\nEssayer de sécuriser les autorisations de partage Windows est un gros défi en raison d&#39;un paramètre appelé contournement de la vérification qui vérifie que le système d&#39;exploitation est activé par défaut. Ce paramètre donne accès aux dossiers même si l&#39;utilisateur n&#39;a de droits d&#39;accès à aucun de ses parents.\nNous pouvons supprimer cette autorisation avec le paramètre d&#39;objet de stratégie de groupe, mais elle est là pour une raison. Sans ce paramètre activé, vous constaterez une baisse importante des performances car Windows vérifiera chaque dossier parent pour voir si l&#39;utilisateur est autorisé à accéder à la cible.\nCet article explique comment créer un rapport sur les autorisations de partage Windows pour déterminer quels utilisateurs ont des autorisations excessives et comment le réparer à l&#39;aide de PowerShell et de Sysinternals.","Rassembler les partages de fichiers et leurs utilisateurs autorisés\nTout d&#39;abord, nous devons trouver les partages de fichiers sur les serveurs et les systèmes clients. Nous pourrions le faire soit en utilisant le Get-SmbShare    ou en appelant l&#39;espace de noms win32_share à l&#39;aide de Get-CimInstance    ou Get-WmiObject.\nPour cet exemple, Get-WmiObject    est le moyen préféré de récupérer nos actions, car il s&#39;agit d&#39;une approche plus rationalisée. Lancez le terminal PowerShell en tant qu&#39;administrateur sur un serveur de fichiers et entrez la commande suivante:\nGet-WMIObject -Class win32_shareNom Chemin Description    ---- ---- -----------    MyShare C:  demo  share Partage de démonstration                    ADMIN $ C:  Administrateur distant WINDOWS   C C:                                               C $ C:  Partage par défaut  D $ D:  Partage par défaut  E $ E:  Partage par défaut  IPC $ IPC distant     imprimer $ C:  WINDOWS  system32  spool  drivers Pilotes d&#39;imprimantescripts C:  scripts\nLa commande PowerShell génère tous les partages, mais elle ne montre pas aux utilisateurs qui y ont accès. En effet, les autorisations de partage Windows résident dans un autre espace de noms appelé Win32_LogicalShareSecuritySetting:\nGet-WmiObject -Class Win32_LogicalShareSecuritySetting\nCette sortie résultante ne nous dit pas grand-chose non plus. Nous avons besoin d&#39;un script PowerShell plus complet pour générer quelque chose de plus utile:\n# Obtenez tous les partages sur l&#39;ordinateur    $ Shares = Get-WMIObject -Class win32_share    # Variable aux actions traitées.    $ NetworkShares = [System.Collections.Generic.List[PSCustomObject]]::Nouveau()    # Ignorez les partages par défaut en filtrant &#39;2147483648&#39;    foreach ($ Part en $ Actions |? $ _. Tapez -ne &#39;2147483648&#39; -et $ _. Nom -ne &#39;print $&#39;) {            # Créez un objet que nous retournerons            $ ShareObject = [PSCustomObject]@                     Nom = $ Share.Name                    Description = $ Share.Description                    LocalPath = $ Share.Path                    ACL = [System.Collections.ArrayList]::Nouveau()                        # Obtenez les paramètres de sécurité pour le partage            $ ShareSecurity = Get-WmiObject -Class Win32_LogicalShareSecuritySetting -Filter &quot;name = &#39;$ ($ Share.Name)&#39;&quot; &quot;            # Si des paramètres de sécurité existent, créez une liste avec les ACL            if ($ Null -ne $ ShareSecurity)                     Essayer                              $ SecurityDescriptor = $ ShareSecurity.GetSecurityDescriptor (). Descriptor                                          foreach ($ AccessControl dans $ SecurityDescriptor.DACL)  Out-Null                                                        # Renvoyer l&#39;objet de partage avec les ACL                            $ NetworkShares.Add ($ ShareObject)                                        Capture                            Erreur d&#39;écriture $ Erreur[0]                                            Autre                     Write-Information &quot;Aucune autorisation trouvée pour $ ($ Share.Name) sur $ ComputerName&quot;                }\nLe contenu du $ NetworkShares    La variable devrait finir par ressembler à ce qui suit:\nPS51&gt; $ NetworkSharesNom Description LocalPath ACL                                                                                                         ---- ----------- --------- ---                                                                                                         DemoShare Demo share C:  demo  share System.Security.AccessControl.FileSystemAccessRule                                                        scripts C:  scripts System.Security.AccessControl.FileSystemAccessRule, System.Security.AccessControl.FileSystemAccessRule    PS51&gt; $ NetworkShares[0].ACL    FileSystemRights: FullControl    AccessControlType: Autoriser    IdentityReference: Tout le monde    IsInherited: False    InheritanceFlags: Aucun    PropagationFlags: Aucun\nNous avons réussi à collecter des données sur nos autorisations de partage Windows, montrant qui a accès à quoi. Cela peut ne pas être suffisant car les administrateurs attribuent généralement des autorisations de partage réseau au niveau NTFS, pas au niveau du partage réseau.\nNous devons également vérifier les fichiers et dossiers du partage s&#39;il existe des autorisations excessives pour d&#39;autres groupes, tels que Tout le monde ou Utilisateurs de domaine.","Analyse des autorisations de fichiers à l&#39;aide d&#39;AccessChk\nNous avons une liste de nos partages de fichiers. Ensuite, nous devons obtenir toutes les autorisations de fichier. La méthode la plus rapide consiste à utiliser l&#39;utilitaire de fichiers AccessChk de la suite Sysinternals et à analyser la sortie avec PowerShell.\nPlacez AccessChk sur votre serveur de fichiers et copiez le fichier AccessChk64.exe dans votre dossier system32. Vous pouvez télécharger l&#39;utilitaire à partir du lien ci-dessus ou utiliser le code PowerShell suivant pour le télécharger et le copier dans votre dossier system32:\nInvoke-WebRequest -OutFile $ env: TEMP  AccessChk.zip -Uri https://download.sysinternals.com/files/AccessChk.zip     Expand-Archive -Path $ env: TEMP  AccessChk.zip -DestinationPath $ env: TEMP -Force    Copy-Item -Path $ env: TEMP  AccessChk64.exe C:  Windows  System32  AccessChk64.exe\nNous pouvons utiliser PowerShell pour créer une fonction wrapper autour d&#39;AccessChk à utiliser dans un script:\nFonction Invoke-AccessChk {            param (                    $ Path,                    $ Directeurs,                    $ AccessChkPath = &quot;$ env: windir  system32  accesschk64.exe&quot;,          [switch]$ Répertoires          [switch]$ AcceptEula                      )            # Accepter le CLUF             if ($ AcceptEula)                     &amp; $ AccessChkPath / accepteula             $ Argument = &quot;uqs&quot;            if ($ DirectoriesOnly)                     $ Argument = &quot;udqs&quot;                        $ Output = &amp; $ AccessChkPath -nobanner - $ Argument $ Path                  Foreach ($ Row dans $ Output)                     # Si c&#39;est une ligne avec un chemin de fichier, sortez l&#39;objet précédent et créez-en un nouveau                    if ($ Row -match &quot;^  S&quot;)                             If ($ Null -ne $ Object)                                     if ($ Object.Access.Keys.Count -gt 0)                                             $ Object                                                                                            $ Object = [PSCustomObject]@                                     Chemin = $ Ligne                                    Accès = @                                                                     # S&#39;il s&#39;agit d&#39;une ligne avec des autorisations                    if ($ Row -match &quot;^  [R ][W ]&quot;) &quot;))                                     $ Row -match &quot;^ (?[R ]) (?[W ]) (?. *) &quot;                                            # Si c&#39;est la dernière ligne - sortez l&#39;objet une fois de plus            if ($ Object.Access.Keys.Count -gt 0)                     $ Object                }\nNous pouvons maintenant courir Invoke-AccessChk    avec les partages réseau stockés dans le $ NetworkShares    variable de l&#39;étape précédente. Nous ajoutons à une liste des principaux de sécurité &#8211; sans &quot;domaine&quot; &#8211; pour trouver:\n# Invoke-AccessChk ne sortira que les fichiers / dossiers où les principaux suivants ont l&#39;autorisation:    $ RiskPrincipals = @ (            &#39;Toutes les personnes&#39;,            «Utilisateurs du domaine»,            «Ordinateurs de domaine»,            &#39;Utilisateurs authentifiés&#39;,            &#39;Utilisateurs&#39;    )    $ RiskyPermissions = Foreach ($ NetworkShare in $ NetworkShares | Select -First 1) ? $ _ -In $ RiskPrincipals)                  if ($ RiskPrincipalExist)                     Invoke-AccessChk -Path $ NetworkShare.LocalPath -Principals $ RiskPrincipals                \nle $ RiskyPermissions    La variable donnera une sortie similaire à ceci:\nPS51&gt; $ RiskyPermissions    Accès au chemin                                               ---- ------                                               C:  demo  share  File1.txt BUILTIN  Users, NT AUTHORITY  Authenticated Users    C:  demo  share  Folder1  picture.png AUTORITÉ NT  Utilisateurs authentifiés                   C:  demo  share  Folder1  Folder2 AUTORITÉ NT  Utilisateurs authentifiés    PS51&gt; $ RiskyPermissions[0].Accès","Création d&#39;un rapport à partir de plusieurs ordinateurs et serveurs\nJusqu&#39;à présent, vous pouvez obtenir une liste de tous les partages de fichiers et vérifier tous les fichiers avec le wrapper PowerShell pour Invoke-AccessChk. L&#39;une des nombreuses forces de PowerShell est sa capacité à évoluer. La communication à distance PowerShell portera le code que nous avons produit au niveau supérieur pour recueillir les informations de plusieurs ordinateurs à la fois.\nTout d&#39;abord, nous avons besoin d&#39;une liste d&#39;ordinateurs et de serveurs à analyser. Si possible, le moyen le plus simple consiste à utiliser le module Active Directory de RSAT:\n$ Computers = (Get-ADComputer -Filter *). DnsHostName\nCette méthode n&#39;est peut-être pas une option dans les environnements plus vastes fortement segmentés. Une autre approche consiste à obtenir des données de votre base de données de gestion de configuration ou à les saisir manuellement à l&#39;aide de l&#39;exemple suivant:\n$ Ordinateurs = @ (            &#39;Server1&#39;,            «Server2»,            «Server3»,            «Server4»,            «Server5»,        «PC1»        # etc    )\nIl est maintenant temps de lier tous ces composants dans un script qui utilise des travaux d&#39;arrière-plan PowerShell pour effectuer les actions suivantes sur les machines spécifiées dans le $ Ordinateurs paramètre:","Obtenez tous les partages partagés avec l&#39;un des principaux dans $ RiskPrincipals.\nTéléchargez AccessChk s&#39;il n&#39;existe pas déjà.\nVérifiez l&#39;autorisation NTFS de tous les partages rassemblés par AccessChk.\nRenvoyer un objet avec une liste avec tous les fichiers où les principaux de sécurité dans $ RiskPrincipals    avoir des autorisations de lecture ou d&#39;écriture.","L&#39;ordinateur exécutant le script collectera ensuite les résultats de tous les travaux et les affichera dans un fichier CSV portant le nom ShareAccessReport.\nN&#39;oubliez pas d&#39;exécuter ce qui suit en tant qu&#39;administrateur sur un ordinateur disposant d&#39;un accès réseau auxdites machines et d&#39;accepter le CLUF pour AccessChk en modifiant $ AcceptEula    à vrai:\n$ Ordinateurs = @ (            «Serveur-1»,            «Serveur-2»,            «PC-1»    )    # Accepter le CLUF pour AccessChk    # CHANGER EN VRAI    $ AcceptEula = $ false    if (! $ AcceptEula)             Write-Warning &quot;N&#39;a pas accepté le CLUF pour AccessChk, ne peut pas continuer&quot;        Pause        # Principaux que nous voulons rechercher    $ RiskPrincipals = @ (            &#39;Toutes les personnes&#39;,            «Utilisateurs du domaine»,            «Ordinateurs de domaine»,            &#39;Utilisateurs authentifiés&#39;,            &#39;Utilisateurs&#39;    )    # Liste des partages que nous voulons ignorer.    # Définir un nom de partage lié juste au cas où, car il devrait presque toujours être ce chemin    $ IgnoreShares = @ (            &#39;print $&#39;    )    # Scriptblock que nous enverrons avec Invoke-Command    $ Scriptblock = {            $ RiskPrincipals = $ args[0].RiskPrincipals            $ IgnoreShares = $ args[1].IgnoreShares            $ AcceptEula = $ args[2].AccepterEula            # Fonctions pour télécharger et utiliser AccessChk            # Il utilise un objet shell au lieu de Expand-Archive pour une compatibilité descendante            Fonction Download-AccessChk                     param (                            $ Url = &quot;https://download.sysinternals.com/files/AccessChk.zip&quot;,                            $ Dest = $ env: temp                    )                    if (Test-Path &quot;$ dest  accesschk.zip&quot;)                             rm $ Dest  AccessCHK.zip -Force                                        (New-Object System.Net.WebClient) .DownloadFile ($ url, &quot;$ env: temp  AccessChk.zip&quot;)                    $ Shell = New-Object -ComObject Shell.Application                    $ Zip = $ shell.NameSpace (&quot;$ env: temp  AccessChk.zip&quot;)                    $ Destination = $ shell.NameSpace (&quot;$ env: windir  system32 &quot;)                    $ copyFlags = 0x00                    $ copyFlags + = 0x04                    $ copyFlags + = 0x10                    $ Destination.CopyHere ($ Zip.Items (), $ copyFlags)                        # La fonction qui utilise accesschk de la partie 2            Fonction Invoke-AccessChk {                    param (                            $ Path,                            $ Directeurs,                            $ AccessChkPath = &quot;$ env: windir  system32  accesschk64.exe&quot;,              [switch]$ Répertoires              [switch]$ AcceptEula                              )                    if (! (Test-Path &quot;$ env: windir  system32  accesschk64.exe&quot;))                             Download-AccessChk                                        # Accepter le CLUF                     if ($ AcceptEula)                             &amp; $ AccessChkPath / accepteula                     $ Argument = &quot;uqs&quot;                    if ($ DirectoriesOnly)                             $ Argument = &quot;udqs&quot;                                        $ Output = &amp; $ AccessChkPath -nobanner - $ Argument $ Path                          Foreach ($ Row dans $ Output)                             # Si c&#39;est une ligne avec un chemin de fichier, sortez l&#39;objet précédent et créez-en un nouveau                            if ($ Row -match &quot;^  S&quot;)                                     If ($ Null -ne $ Object)                                             if ($ Object.Access.Keys.Count -gt 0)                                                     $ Object                                                                                                                    $ Object = [PSCustomObject]@                                             Chemin = $ Ligne                                            Accès = @                                                                                             # S&#39;il s&#39;agit d&#39;une ligne avec des autorisations                            if ($ Row -match &quot;^  [R ][W ]&quot;) &quot;))  Out-Null                                                                      $ Object.Access[$Matches.Principal] = @                                                     Read = $ Matches.Read -eq &#39;R&#39;                                                    Write = $ Matches.Read -eq &#39;W&#39;                                                                                                                                                    # Si c&#39;est la dernière ligne - sortez l&#39;objet une fois de plus                    if ($ Object.Access.Keys.Count -gt 0)                             $ Object                                }            # Obtenez tous les partages en utilisant WMI            $ Shares = Get-WmiObject -Class win32_share            # Créez un objet que nous reviendrons plus tard lorsque nous aurons terminé            $ ReturnObject = [PSCustomObject]@                     ComputerName = $ ComputerName                    NetworkShares = [System.Collections.Generic.List[PSCustomObject]]::Nouveau()                    AccessibleObjects = @                         # Ignorez les partages par défaut en filtrant &#39;2147483648&#39;            # Ignorer les parts de $ IgnoreShares            foreach ($ Part en $ Actions |? $ _. Tapez -ne &#39;2147483648&#39; |? $ _. Nom -notin $ IgnoreShares) {                    $ ShareObject = [PSCustomObject]@                             Nom = $ Share.Name                            Description = $ Share.Description                            LocalPath = $ Share.Path                            ACL = [System.Collections.ArrayList]::Nouveau()                                        $ ShareSecurity = Get-WMIObject -Class Win32_LogicalShareSecuritySetting -Filter &quot;name = &#39;$ ($ Share.Name)&#39;&quot; &quot;                    if ($ Null -ne $ ShareSecurity) {                            Essayer                                      $ SecurityDescriptor = $ ShareSecurity.GetSecurityDescriptor (). Descriptor                                                  foreach ($ AccessControl dans $ SecurityDescriptor.DACL)  Out-Null                                                                        # Ajouter un partage réseau uniquement s&#39;il contient un utilisateur / groupe à risque                                                  $ Match = $ False                                    Foreach ($ IdentityReference dans $ ShareObject.ACL.IdentityReference.Value)                                             Foreach ($ Pattern in $ RiskPrincipals)                                                     if ($ IdentityReference -Match $ Pattern)                                                                            $ Match = $ True                                                                                                                                                                        if ($ Match)                                             $ ReturnObject.NetworkShares.Add ($ ShareObject)                                                                            Autre                                             Write-Verbose &quot;Aucune correspondance pour les groupes à risque, n&#39;ajoutant pas&quot;                                                                                                             Capture                                    Erreur d&#39;écriture $ Erreur[0]                                                }                    Autre                             Write-Information &quot;Aucune autorisation trouvée pour $ ($ Share.Name) sur $ ComputerName&quot;                                        }            # Obtenez tous les fichiers de NetworkShares où un principal de $ RiskPrincipals a un accès en lecture ou en écriture            $ ReturnObject.NetworkShares | Pour chaque                     $ ReturnObject.AccessibleObjects[$_.Name] = Invoke-AccessChk -Path $ _. LocalPath -Principals $ RiskPrincipals -AcceptEula: $ AcceptEula                        # Terminé! Permet de renvoyer l&#39;objet de retour:            $ ReturnObject    }    # À ajouter à la liste d&#39;arguments d&#39;Invoke-Job car le travail PowerShell distant n&#39;a pas accès à notre espace variable.    $ InvokeParam = @             RiskPrincipals = $ RiskPrincipals            IgnoreShares = $ IgnoreShares            AcceptEula = $ AcceptEULA        # Commencer les travaux    $ Job = Invoke-Command -AsJob -ComputerName $ Computers -ArgumentList $ InvokeParam -ScriptBlock $ Scriptblock    # Attendez la fin des travaux    $ Job | Wait-Job    # Collecte des données de tous les travaux    $ Output = Get-Job | Receive-Job    # Sortie de la sortie dans un CSV    $ ToCSV = Foreach ($ Résultat dans $ Output) {            Foreach ($ Entrez $ Result.AccessibleObjects.Keys)  Sélectionnez @ Name = &#39;ShareName&#39;; Expression = $ Key, Path, $ ReadAccess, $ WriteAccess                }    # Exporter le CSV    $ ToCSV | Export-Csv -Path.  ShareAccessReport.csv\nLorsque le travail PowerShell se termine, il crée un rapport complet de l&#39;accès des principaux dans le $ RiskyPrincipals    variable.","Correction des autorisations de partage Windows\nAprès avoir examiné le CSV et trouvé les autorisations qui doivent être ajustées, il existe deux façons de les corriger. S&#39;il n&#39;y en a que quelques-uns, le meilleur moyen est d&#39;utiliser l&#39;interface graphique. Mais s&#39;il y en a des milliers, la commande suivante utilisera la sortie CSV pour accélérer cela:\n# Cela doit s&#39;exécuter localement sur le serveur avec le partage de fichiers.    $ UserToRemove = &#39;Invité&#39;    $ CSV = Import-Csv -Path.  ShareAccessReport.csv | ?     $ CSV | ? $ _. ComputerName -eq $ env: COMPUTERNAME | Pour chaque             $ ACL = Get-Acl -Path $ _. Path            $ ACL.Access \nCe script PowerShell supprimera toutes les autorisations du principal de sécurité invité.\nLe premier rapport apportera généralement beaucoup de travail car il découvrira beaucoup de bizarreries et de risques en ce qui concerne vos autorisations de partage Windows. Mais la gestion régulière d&#39;une solution comme celle-ci, spécialement destinée aux partages contenant des informations sensibles, sera finalement payante.","Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"],"content_blocks":[{"id":"text-1","type":"text","heading":"","plain_text":"Garder vos données en sécurité et à l&#39;abri des utilisateurs non autorisés est une tâche complexe, qui peut être encore plus difficile si un paramètre par défaut dans Windows vous gêne.\nEssayer de sécuriser les autorisations de partage Windows est un gros défi en raison d&#39;un paramètre appelé contournement de la vérification qui vérifie que le système d&#39;exploitation est activé par défaut. Ce paramètre donne accès aux dossiers même si l&#39;utilisateur n&#39;a de droits d&#39;accès à aucun de ses parents.\nNous pouvons supprimer cette autorisation avec le paramètre d&#39;objet de stratégie de groupe, mais elle est là pour une raison. Sans ce paramètre activé, vous constaterez une baisse importante des performances car Windows vérifiera chaque dossier parent pour voir si l&#39;utilisateur est autorisé à accéder à la cible.\nCet article explique comment créer un rapport sur les autorisations de partage Windows pour déterminer quels utilisateurs ont des autorisations excessives et comment le réparer à l&#39;aide de PowerShell et de Sysinternals.","html":"<p>Garder vos données en sécurité et à l&#039;abri des utilisateurs non autorisés est une tâche complexe, qui peut être encore plus difficile si un paramètre par défaut dans Windows vous gêne.\nEssayer de sécuriser les autorisations de partage Windows est un gros défi en raison d&#039;un paramètre appelé contournement de la vérification qui vérifie que le système d&#039;exploitation est activé par défaut. Ce paramètre donne accès aux dossiers même si l&#039;utilisateur n&#039;a de droits d&#039;accès à aucun de ses parents.\nNous pouvons supprimer cette autorisation avec le paramètre d&#039;objet de stratégie de groupe, mais elle est là pour une raison. Sans ce paramètre activé, vous constaterez une baisse importante des performances car Windows vérifiera chaque dossier parent pour voir si l&#039;utilisateur est autorisé à accéder à la cible.\nCet article explique comment créer un rapport sur les autorisations de partage Windows pour déterminer quels utilisateurs ont des autorisations excessives et comment le réparer à l&#039;aide de PowerShell et de Sysinternals.</p>"},{"id":"text-2","type":"text","heading":"","plain_text":"Rassembler les partages de fichiers et leurs utilisateurs autorisés\nTout d&#39;abord, nous devons trouver les partages de fichiers sur les serveurs et les systèmes clients. Nous pourrions le faire soit en utilisant le Get-SmbShare    ou en appelant l&#39;espace de noms win32_share à l&#39;aide de Get-CimInstance    ou Get-WmiObject.\nPour cet exemple, Get-WmiObject    est le moyen préféré de récupérer nos actions, car il s&#39;agit d&#39;une approche plus rationalisée. Lancez le terminal PowerShell en tant qu&#39;administrateur sur un serveur de fichiers et entrez la commande suivante:\nGet-WMIObject -Class win32_shareNom Chemin Description    ---- ---- -----------    MyShare C:  demo  share Partage de démonstration                    ADMIN $ C:  Administrateur distant WINDOWS   C C:                                               C $ C:  Partage par défaut  D $ D:  Partage par défaut  E $ E:  Partage par défaut  IPC $ IPC distant     imprimer $ C:  WINDOWS  system32  spool  drivers Pilotes d&#39;imprimantescripts C:  scripts\nLa commande PowerShell génère tous les partages, mais elle ne montre pas aux utilisateurs qui y ont accès. En effet, les autorisations de partage Windows résident dans un autre espace de noms appelé Win32_LogicalShareSecuritySetting:\nGet-WmiObject -Class Win32_LogicalShareSecuritySetting\nCette sortie résultante ne nous dit pas grand-chose non plus. Nous avons besoin d&#39;un script PowerShell plus complet pour générer quelque chose de plus utile:\n# Obtenez tous les partages sur l&#39;ordinateur    $ Shares = Get-WMIObject -Class win32_share    # Variable aux actions traitées.    $ NetworkShares = [System.Collections.Generic.List[PSCustomObject]]::Nouveau()    # Ignorez les partages par défaut en filtrant &#39;2147483648&#39;    foreach ($ Part en $ Actions |? $ _. Tapez -ne &#39;2147483648&#39; -et $ _. Nom -ne &#39;print $&#39;) {            # Créez un objet que nous retournerons            $ ShareObject = [PSCustomObject]@                     Nom = $ Share.Name                    Description = $ Share.Description                    LocalPath = $ Share.Path                    ACL = [System.Collections.ArrayList]::Nouveau()                        # Obtenez les paramètres de sécurité pour le partage            $ ShareSecurity = Get-WmiObject -Class Win32_LogicalShareSecuritySetting -Filter &quot;name = &#39;$ ($ Share.Name)&#39;&quot; &quot;            # Si des paramètres de sécurité existent, créez une liste avec les ACL            if ($ Null -ne $ ShareSecurity)                     Essayer                              $ SecurityDescriptor = $ ShareSecurity.GetSecurityDescriptor (). Descriptor                                          foreach ($ AccessControl dans $ SecurityDescriptor.DACL)  Out-Null                                                        # Renvoyer l&#39;objet de partage avec les ACL                            $ NetworkShares.Add ($ ShareObject)                                        Capture                            Erreur d&#39;écriture $ Erreur[0]                                            Autre                     Write-Information &quot;Aucune autorisation trouvée pour $ ($ Share.Name) sur $ ComputerName&quot;                }\nLe contenu du $ NetworkShares    La variable devrait finir par ressembler à ce qui suit:\nPS51&gt; $ NetworkSharesNom Description LocalPath ACL                                                                                                         ---- ----------- --------- ---                                                                                                         DemoShare Demo share C:  demo  share System.Security.AccessControl.FileSystemAccessRule                                                        scripts C:  scripts System.Security.AccessControl.FileSystemAccessRule, System.Security.AccessControl.FileSystemAccessRule    PS51&gt; $ NetworkShares[0].ACL    FileSystemRights: FullControl    AccessControlType: Autoriser    IdentityReference: Tout le monde    IsInherited: False    InheritanceFlags: Aucun    PropagationFlags: Aucun\nNous avons réussi à collecter des données sur nos autorisations de partage Windows, montrant qui a accès à quoi. Cela peut ne pas être suffisant car les administrateurs attribuent généralement des autorisations de partage réseau au niveau NTFS, pas au niveau du partage réseau.\nNous devons également vérifier les fichiers et dossiers du partage s&#39;il existe des autorisations excessives pour d&#39;autres groupes, tels que Tout le monde ou Utilisateurs de domaine.","html":"<p>Rassembler les partages de fichiers et leurs utilisateurs autorisés\nTout d&#039;abord, nous devons trouver les partages de fichiers sur les serveurs et les systèmes clients. Nous pourrions le faire soit en utilisant le Get-SmbShare    ou en appelant l&#039;espace de noms win32_share à l&#039;aide de Get-CimInstance    ou Get-WmiObject.\nPour cet exemple, Get-WmiObject    est le moyen préféré de récupérer nos actions, car il s&#039;agit d&#039;une approche plus rationalisée. Lancez le terminal PowerShell en tant qu&#039;administrateur sur un serveur de fichiers et entrez la commande suivante:\nGet-WMIObject -Class win32_shareNom Chemin Description    ---- ---- -----------    MyShare C:  demo  share Partage de démonstration                    ADMIN $ C:  Administrateur distant WINDOWS   C C:                                               C $ C:  Partage par défaut  D $ D:  Partage par défaut  E $ E:  Partage par défaut  IPC $ IPC distant     imprimer $ C:  WINDOWS  system32  spool  drivers Pilotes d&#039;imprimantescripts C:  scripts\nLa commande PowerShell génère tous les partages, mais elle ne montre pas aux utilisateurs qui y ont accès. En effet, les autorisations de partage Windows résident dans un autre espace de noms appelé Win32_LogicalShareSecuritySetting:\nGet-WmiObject -Class Win32_LogicalShareSecuritySetting\nCette sortie résultante ne nous dit pas grand-chose non plus. Nous avons besoin d&#039;un script PowerShell plus complet pour générer quelque chose de plus utile:\n# Obtenez tous les partages sur l&#039;ordinateur    $ Shares = Get-WMIObject -Class win32_share    # Variable aux actions traitées.    $ NetworkShares = [System.Collections.Generic.List[PSCustomObject]]::Nouveau()    # Ignorez les partages par défaut en filtrant &#039;2147483648&#039;    foreach ($ Part en $ Actions |? $ _. Tapez -ne &#039;2147483648&#039; -et $ _. Nom -ne &#039;print $&#039;) {            # Créez un objet que nous retournerons            $ ShareObject = [PSCustomObject]@                     Nom = $ Share.Name                    Description = $ Share.Description                    LocalPath = $ Share.Path                    ACL = [System.Collections.ArrayList]::Nouveau()                        # Obtenez les paramètres de sécurité pour le partage            $ ShareSecurity = Get-WmiObject -Class Win32_LogicalShareSecuritySetting -Filter &quot;name = &#039;$ ($ Share.Name)&#039;&quot; &quot;            # Si des paramètres de sécurité existent, créez une liste avec les ACL            if ($ Null -ne $ ShareSecurity)                     Essayer                              $ SecurityDescriptor = $ ShareSecurity.GetSecurityDescriptor (). Descriptor                                          foreach ($ AccessControl dans $ SecurityDescriptor.DACL)  Out-Null                                                        # Renvoyer l&#039;objet de partage avec les ACL                            $ NetworkShares.Add ($ ShareObject)                                        Capture                            Erreur d&#039;écriture $ Erreur[0]                                            Autre                     Write-Information &quot;Aucune autorisation trouvée pour $ ($ Share.Name) sur $ ComputerName&quot;                }\nLe contenu du $ NetworkShares    La variable devrait finir par ressembler à ce qui suit:\nPS51&gt; $ NetworkSharesNom Description LocalPath ACL                                                                                                         ---- ----------- --------- ---                                                                                                         DemoShare Demo share C:  demo  share System.Security.AccessControl.FileSystemAccessRule                                                        scripts C:  scripts System.Security.AccessControl.FileSystemAccessRule, System.Security.AccessControl.FileSystemAccessRule    PS51&gt; $ NetworkShares[0].ACL    FileSystemRights: FullControl    AccessControlType: Autoriser    IdentityReference: Tout le monde    IsInherited: False    InheritanceFlags: Aucun    PropagationFlags: Aucun\nNous avons réussi à collecter des données sur nos autorisations de partage Windows, montrant qui a accès à quoi. Cela peut ne pas être suffisant car les administrateurs attribuent généralement des autorisations de partage réseau au niveau NTFS, pas au niveau du partage réseau.\nNous devons également vérifier les fichiers et dossiers du partage s&#039;il existe des autorisations excessives pour d&#039;autres groupes, tels que Tout le monde ou Utilisateurs de domaine.</p>"},{"id":"text-3","type":"text","heading":"","plain_text":"Analyse des autorisations de fichiers à l&#39;aide d&#39;AccessChk\nNous avons une liste de nos partages de fichiers. Ensuite, nous devons obtenir toutes les autorisations de fichier. La méthode la plus rapide consiste à utiliser l&#39;utilitaire de fichiers AccessChk de la suite Sysinternals et à analyser la sortie avec PowerShell.\nPlacez AccessChk sur votre serveur de fichiers et copiez le fichier AccessChk64.exe dans votre dossier system32. Vous pouvez télécharger l&#39;utilitaire à partir du lien ci-dessus ou utiliser le code PowerShell suivant pour le télécharger et le copier dans votre dossier system32:\nInvoke-WebRequest -OutFile $ env: TEMP  AccessChk.zip -Uri https://download.sysinternals.com/files/AccessChk.zip     Expand-Archive -Path $ env: TEMP  AccessChk.zip -DestinationPath $ env: TEMP -Force    Copy-Item -Path $ env: TEMP  AccessChk64.exe C:  Windows  System32  AccessChk64.exe\nNous pouvons utiliser PowerShell pour créer une fonction wrapper autour d&#39;AccessChk à utiliser dans un script:\nFonction Invoke-AccessChk {            param (                    $ Path,                    $ Directeurs,                    $ AccessChkPath = &quot;$ env: windir  system32  accesschk64.exe&quot;,          [switch]$ Répertoires          [switch]$ AcceptEula                      )            # Accepter le CLUF             if ($ AcceptEula)                     &amp; $ AccessChkPath / accepteula             $ Argument = &quot;uqs&quot;            if ($ DirectoriesOnly)                     $ Argument = &quot;udqs&quot;                        $ Output = &amp; $ AccessChkPath -nobanner - $ Argument $ Path                  Foreach ($ Row dans $ Output)                     # Si c&#39;est une ligne avec un chemin de fichier, sortez l&#39;objet précédent et créez-en un nouveau                    if ($ Row -match &quot;^  S&quot;)                             If ($ Null -ne $ Object)                                     if ($ Object.Access.Keys.Count -gt 0)                                             $ Object                                                                                            $ Object = [PSCustomObject]@                                     Chemin = $ Ligne                                    Accès = @                                                                     # S&#39;il s&#39;agit d&#39;une ligne avec des autorisations                    if ($ Row -match &quot;^  [R ][W ]&quot;) &quot;))                                     $ Row -match &quot;^ (?[R ]) (?[W ]) (?. *) &quot;                                            # Si c&#39;est la dernière ligne - sortez l&#39;objet une fois de plus            if ($ Object.Access.Keys.Count -gt 0)                     $ Object                }\nNous pouvons maintenant courir Invoke-AccessChk    avec les partages réseau stockés dans le $ NetworkShares    variable de l&#39;étape précédente. Nous ajoutons à une liste des principaux de sécurité &#8211; sans &quot;domaine&quot; &#8211; pour trouver:\n# Invoke-AccessChk ne sortira que les fichiers / dossiers où les principaux suivants ont l&#39;autorisation:    $ RiskPrincipals = @ (            &#39;Toutes les personnes&#39;,            «Utilisateurs du domaine»,            «Ordinateurs de domaine»,            &#39;Utilisateurs authentifiés&#39;,            &#39;Utilisateurs&#39;    )    $ RiskyPermissions = Foreach ($ NetworkShare in $ NetworkShares | Select -First 1) ? $ _ -In $ RiskPrincipals)                  if ($ RiskPrincipalExist)                     Invoke-AccessChk -Path $ NetworkShare.LocalPath -Principals $ RiskPrincipals                \nle $ RiskyPermissions    La variable donnera une sortie similaire à ceci:\nPS51&gt; $ RiskyPermissions    Accès au chemin                                               ---- ------                                               C:  demo  share  File1.txt BUILTIN  Users, NT AUTHORITY  Authenticated Users    C:  demo  share  Folder1  picture.png AUTORITÉ NT  Utilisateurs authentifiés                   C:  demo  share  Folder1  Folder2 AUTORITÉ NT  Utilisateurs authentifiés    PS51&gt; $ RiskyPermissions[0].Accès","html":"<p>Analyse des autorisations de fichiers à l&#039;aide d&#039;AccessChk\nNous avons une liste de nos partages de fichiers. Ensuite, nous devons obtenir toutes les autorisations de fichier. La méthode la plus rapide consiste à utiliser l&#039;utilitaire de fichiers AccessChk de la suite Sysinternals et à analyser la sortie avec PowerShell.\nPlacez AccessChk sur votre serveur de fichiers et copiez le fichier AccessChk64.exe dans votre dossier system32. Vous pouvez télécharger l&#039;utilitaire à partir du lien ci-dessus ou utiliser le code PowerShell suivant pour le télécharger et le copier dans votre dossier system32:\nInvoke-WebRequest -OutFile $ env: TEMP  AccessChk.zip -Uri https://download.sysinternals.com/files/AccessChk.zip     Expand-Archive -Path $ env: TEMP  AccessChk.zip -DestinationPath $ env: TEMP -Force    Copy-Item -Path $ env: TEMP  AccessChk64.exe C:  Windows  System32  AccessChk64.exe\nNous pouvons utiliser PowerShell pour créer une fonction wrapper autour d&#039;AccessChk à utiliser dans un script:\nFonction Invoke-AccessChk {            param (                    $ Path,                    $ Directeurs,                    $ AccessChkPath = &quot;$ env: windir  system32  accesschk64.exe&quot;,          [switch]$ Répertoires          [switch]$ AcceptEula                      )            # Accepter le CLUF             if ($ AcceptEula)                     &amp; $ AccessChkPath / accepteula             $ Argument = &quot;uqs&quot;            if ($ DirectoriesOnly)                     $ Argument = &quot;udqs&quot;                        $ Output = &amp; $ AccessChkPath -nobanner - $ Argument $ Path                  Foreach ($ Row dans $ Output)                     # Si c&#039;est une ligne avec un chemin de fichier, sortez l&#039;objet précédent et créez-en un nouveau                    if ($ Row -match &quot;^  S&quot;)                             If ($ Null -ne $ Object)                                     if ($ Object.Access.Keys.Count -gt 0)                                             $ Object                                                                                            $ Object = [PSCustomObject]@                                     Chemin = $ Ligne                                    Accès = @                                                                     # S&#039;il s&#039;agit d&#039;une ligne avec des autorisations                    if ($ Row -match &quot;^  [R ][W ]&quot;) &quot;))                                     $ Row -match &quot;^ (?[R ]) (?[W ]) (?. *) &quot;                                            # Si c&#039;est la dernière ligne - sortez l&#039;objet une fois de plus            if ($ Object.Access.Keys.Count -gt 0)                     $ Object                }\nNous pouvons maintenant courir Invoke-AccessChk    avec les partages réseau stockés dans le $ NetworkShares    variable de l&#039;étape précédente. Nous ajoutons à une liste des principaux de sécurité &#8211; sans &quot;domaine&quot; &#8211; pour trouver:\n# Invoke-AccessChk ne sortira que les fichiers / dossiers où les principaux suivants ont l&#039;autorisation:    $ RiskPrincipals = @ (            &#039;Toutes les personnes&#039;,            «Utilisateurs du domaine»,            «Ordinateurs de domaine»,            &#039;Utilisateurs authentifiés&#039;,            &#039;Utilisateurs&#039;    )    $ RiskyPermissions = Foreach ($ NetworkShare in $ NetworkShares | Select -First 1) ? $ _ -In $ RiskPrincipals)                  if ($ RiskPrincipalExist)                     Invoke-AccessChk -Path $ NetworkShare.LocalPath -Principals $ RiskPrincipals                \nle $ RiskyPermissions    La variable donnera une sortie similaire à ceci:\nPS51&gt; $ RiskyPermissions    Accès au chemin                                               ---- ------                                               C:  demo  share  File1.txt BUILTIN  Users, NT AUTHORITY  Authenticated Users    C:  demo  share  Folder1  picture.png AUTORITÉ NT  Utilisateurs authentifiés                   C:  demo  share  Folder1  Folder2 AUTORITÉ NT  Utilisateurs authentifiés    PS51&gt; $ RiskyPermissions[0].Accès</p>"},{"id":"text-4","type":"text","heading":"","plain_text":"Création d&#39;un rapport à partir de plusieurs ordinateurs et serveurs\nJusqu&#39;à présent, vous pouvez obtenir une liste de tous les partages de fichiers et vérifier tous les fichiers avec le wrapper PowerShell pour Invoke-AccessChk. L&#39;une des nombreuses forces de PowerShell est sa capacité à évoluer. La communication à distance PowerShell portera le code que nous avons produit au niveau supérieur pour recueillir les informations de plusieurs ordinateurs à la fois.\nTout d&#39;abord, nous avons besoin d&#39;une liste d&#39;ordinateurs et de serveurs à analyser. Si possible, le moyen le plus simple consiste à utiliser le module Active Directory de RSAT:\n$ Computers = (Get-ADComputer -Filter *). DnsHostName\nCette méthode n&#39;est peut-être pas une option dans les environnements plus vastes fortement segmentés. Une autre approche consiste à obtenir des données de votre base de données de gestion de configuration ou à les saisir manuellement à l&#39;aide de l&#39;exemple suivant:\n$ Ordinateurs = @ (            &#39;Server1&#39;,            «Server2»,            «Server3»,            «Server4»,            «Server5»,        «PC1»        # etc    )\nIl est maintenant temps de lier tous ces composants dans un script qui utilise des travaux d&#39;arrière-plan PowerShell pour effectuer les actions suivantes sur les machines spécifiées dans le $ Ordinateurs paramètre:","html":"<p>Création d&#039;un rapport à partir de plusieurs ordinateurs et serveurs\nJusqu&#039;à présent, vous pouvez obtenir une liste de tous les partages de fichiers et vérifier tous les fichiers avec le wrapper PowerShell pour Invoke-AccessChk. L&#039;une des nombreuses forces de PowerShell est sa capacité à évoluer. La communication à distance PowerShell portera le code que nous avons produit au niveau supérieur pour recueillir les informations de plusieurs ordinateurs à la fois.\nTout d&#039;abord, nous avons besoin d&#039;une liste d&#039;ordinateurs et de serveurs à analyser. Si possible, le moyen le plus simple consiste à utiliser le module Active Directory de RSAT:\n$ Computers = (Get-ADComputer -Filter *). DnsHostName\nCette méthode n&#039;est peut-être pas une option dans les environnements plus vastes fortement segmentés. Une autre approche consiste à obtenir des données de votre base de données de gestion de configuration ou à les saisir manuellement à l&#039;aide de l&#039;exemple suivant:\n$ Ordinateurs = @ (            &#039;Server1&#039;,            «Server2»,            «Server3»,            «Server4»,            «Server5»,        «PC1»        # etc    )\nIl est maintenant temps de lier tous ces composants dans un script qui utilise des travaux d&#039;arrière-plan PowerShell pour effectuer les actions suivantes sur les machines spécifiées dans le $ Ordinateurs paramètre:</p>"},{"id":"text-5","type":"text","heading":"","plain_text":"Obtenez tous les partages partagés avec l&#39;un des principaux dans $ RiskPrincipals.\nTéléchargez AccessChk s&#39;il n&#39;existe pas déjà.\nVérifiez l&#39;autorisation NTFS de tous les partages rassemblés par AccessChk.\nRenvoyer un objet avec une liste avec tous les fichiers où les principaux de sécurité dans $ RiskPrincipals    avoir des autorisations de lecture ou d&#39;écriture.","html":"<p>Obtenez tous les partages partagés avec l&#039;un des principaux dans $ RiskPrincipals.\nTéléchargez AccessChk s&#039;il n&#039;existe pas déjà.\nVérifiez l&#039;autorisation NTFS de tous les partages rassemblés par AccessChk.\nRenvoyer un objet avec une liste avec tous les fichiers où les principaux de sécurité dans $ RiskPrincipals    avoir des autorisations de lecture ou d&#039;écriture.</p>"},{"id":"text-6","type":"text","heading":"","plain_text":"L&#39;ordinateur exécutant le script collectera ensuite les résultats de tous les travaux et les affichera dans un fichier CSV portant le nom ShareAccessReport.\nN&#39;oubliez pas d&#39;exécuter ce qui suit en tant qu&#39;administrateur sur un ordinateur disposant d&#39;un accès réseau auxdites machines et d&#39;accepter le CLUF pour AccessChk en modifiant $ AcceptEula    à vrai:\n$ Ordinateurs = @ (            «Serveur-1»,            «Serveur-2»,            «PC-1»    )    # Accepter le CLUF pour AccessChk    # CHANGER EN VRAI    $ AcceptEula = $ false    if (! $ AcceptEula)             Write-Warning &quot;N&#39;a pas accepté le CLUF pour AccessChk, ne peut pas continuer&quot;        Pause        # Principaux que nous voulons rechercher    $ RiskPrincipals = @ (            &#39;Toutes les personnes&#39;,            «Utilisateurs du domaine»,            «Ordinateurs de domaine»,            &#39;Utilisateurs authentifiés&#39;,            &#39;Utilisateurs&#39;    )    # Liste des partages que nous voulons ignorer.    # Définir un nom de partage lié juste au cas où, car il devrait presque toujours être ce chemin    $ IgnoreShares = @ (            &#39;print $&#39;    )    # Scriptblock que nous enverrons avec Invoke-Command    $ Scriptblock = {            $ RiskPrincipals = $ args[0].RiskPrincipals            $ IgnoreShares = $ args[1].IgnoreShares            $ AcceptEula = $ args[2].AccepterEula            # Fonctions pour télécharger et utiliser AccessChk            # Il utilise un objet shell au lieu de Expand-Archive pour une compatibilité descendante            Fonction Download-AccessChk                     param (                            $ Url = &quot;https://download.sysinternals.com/files/AccessChk.zip&quot;,                            $ Dest = $ env: temp                    )                    if (Test-Path &quot;$ dest  accesschk.zip&quot;)                             rm $ Dest  AccessCHK.zip -Force                                        (New-Object System.Net.WebClient) .DownloadFile ($ url, &quot;$ env: temp  AccessChk.zip&quot;)                    $ Shell = New-Object -ComObject Shell.Application                    $ Zip = $ shell.NameSpace (&quot;$ env: temp  AccessChk.zip&quot;)                    $ Destination = $ shell.NameSpace (&quot;$ env: windir  system32 &quot;)                    $ copyFlags = 0x00                    $ copyFlags + = 0x04                    $ copyFlags + = 0x10                    $ Destination.CopyHere ($ Zip.Items (), $ copyFlags)                        # La fonction qui utilise accesschk de la partie 2            Fonction Invoke-AccessChk {                    param (                            $ Path,                            $ Directeurs,                            $ AccessChkPath = &quot;$ env: windir  system32  accesschk64.exe&quot;,              [switch]$ Répertoires              [switch]$ AcceptEula                              )                    if (! (Test-Path &quot;$ env: windir  system32  accesschk64.exe&quot;))                             Download-AccessChk                                        # Accepter le CLUF                     if ($ AcceptEula)                             &amp; $ AccessChkPath / accepteula                     $ Argument = &quot;uqs&quot;                    if ($ DirectoriesOnly)                             $ Argument = &quot;udqs&quot;                                        $ Output = &amp; $ AccessChkPath -nobanner - $ Argument $ Path                          Foreach ($ Row dans $ Output)                             # Si c&#39;est une ligne avec un chemin de fichier, sortez l&#39;objet précédent et créez-en un nouveau                            if ($ Row -match &quot;^  S&quot;)                                     If ($ Null -ne $ Object)                                             if ($ Object.Access.Keys.Count -gt 0)                                                     $ Object                                                                                                                    $ Object = [PSCustomObject]@                                             Chemin = $ Ligne                                            Accès = @                                                                                             # S&#39;il s&#39;agit d&#39;une ligne avec des autorisations                            if ($ Row -match &quot;^  [R ][W ]&quot;) &quot;))  Out-Null                                                                      $ Object.Access[$Matches.Principal] = @                                                     Read = $ Matches.Read -eq &#39;R&#39;                                                    Write = $ Matches.Read -eq &#39;W&#39;                                                                                                                                                    # Si c&#39;est la dernière ligne - sortez l&#39;objet une fois de plus                    if ($ Object.Access.Keys.Count -gt 0)                             $ Object                                }            # Obtenez tous les partages en utilisant WMI            $ Shares = Get-WmiObject -Class win32_share            # Créez un objet que nous reviendrons plus tard lorsque nous aurons terminé            $ ReturnObject = [PSCustomObject]@                     ComputerName = $ ComputerName                    NetworkShares = [System.Collections.Generic.List[PSCustomObject]]::Nouveau()                    AccessibleObjects = @                         # Ignorez les partages par défaut en filtrant &#39;2147483648&#39;            # Ignorer les parts de $ IgnoreShares            foreach ($ Part en $ Actions |? $ _. Tapez -ne &#39;2147483648&#39; |? $ _. Nom -notin $ IgnoreShares) {                    $ ShareObject = [PSCustomObject]@                             Nom = $ Share.Name                            Description = $ Share.Description                            LocalPath = $ Share.Path                            ACL = [System.Collections.ArrayList]::Nouveau()                                        $ ShareSecurity = Get-WMIObject -Class Win32_LogicalShareSecuritySetting -Filter &quot;name = &#39;$ ($ Share.Name)&#39;&quot; &quot;                    if ($ Null -ne $ ShareSecurity) {                            Essayer                                      $ SecurityDescriptor = $ ShareSecurity.GetSecurityDescriptor (). Descriptor                                                  foreach ($ AccessControl dans $ SecurityDescriptor.DACL)  Out-Null                                                                        # Ajouter un partage réseau uniquement s&#39;il contient un utilisateur / groupe à risque                                                  $ Match = $ False                                    Foreach ($ IdentityReference dans $ ShareObject.ACL.IdentityReference.Value)                                             Foreach ($ Pattern in $ RiskPrincipals)                                                     if ($ IdentityReference -Match $ Pattern)                                                                            $ Match = $ True                                                                                                                                                                        if ($ Match)                                             $ ReturnObject.NetworkShares.Add ($ ShareObject)                                                                            Autre                                             Write-Verbose &quot;Aucune correspondance pour les groupes à risque, n&#39;ajoutant pas&quot;                                                                                                             Capture                                    Erreur d&#39;écriture $ Erreur[0]                                                }                    Autre                             Write-Information &quot;Aucune autorisation trouvée pour $ ($ Share.Name) sur $ ComputerName&quot;                                        }            # Obtenez tous les fichiers de NetworkShares où un principal de $ RiskPrincipals a un accès en lecture ou en écriture            $ ReturnObject.NetworkShares | Pour chaque                     $ ReturnObject.AccessibleObjects[$_.Name] = Invoke-AccessChk -Path $ _. LocalPath -Principals $ RiskPrincipals -AcceptEula: $ AcceptEula                        # Terminé! Permet de renvoyer l&#39;objet de retour:            $ ReturnObject    }    # À ajouter à la liste d&#39;arguments d&#39;Invoke-Job car le travail PowerShell distant n&#39;a pas accès à notre espace variable.    $ InvokeParam = @             RiskPrincipals = $ RiskPrincipals            IgnoreShares = $ IgnoreShares            AcceptEula = $ AcceptEULA        # Commencer les travaux    $ Job = Invoke-Command -AsJob -ComputerName $ Computers -ArgumentList $ InvokeParam -ScriptBlock $ Scriptblock    # Attendez la fin des travaux    $ Job | Wait-Job    # Collecte des données de tous les travaux    $ Output = Get-Job | Receive-Job    # Sortie de la sortie dans un CSV    $ ToCSV = Foreach ($ Résultat dans $ Output) {            Foreach ($ Entrez $ Result.AccessibleObjects.Keys)  Sélectionnez @ Name = &#39;ShareName&#39;; Expression = $ Key, Path, $ ReadAccess, $ WriteAccess                }    # Exporter le CSV    $ ToCSV | Export-Csv -Path.  ShareAccessReport.csv\nLorsque le travail PowerShell se termine, il crée un rapport complet de l&#39;accès des principaux dans le $ RiskyPrincipals    variable.","html":"<p>L&#039;ordinateur exécutant le script collectera ensuite les résultats de tous les travaux et les affichera dans un fichier CSV portant le nom ShareAccessReport.\nN&#039;oubliez pas d&#039;exécuter ce qui suit en tant qu&#039;administrateur sur un ordinateur disposant d&#039;un accès réseau auxdites machines et d&#039;accepter le CLUF pour AccessChk en modifiant $ AcceptEula    à vrai:\n$ Ordinateurs = @ (            «Serveur-1»,            «Serveur-2»,            «PC-1»    )    # Accepter le CLUF pour AccessChk    # CHANGER EN VRAI    $ AcceptEula = $ false    if (! $ AcceptEula)             Write-Warning &quot;N&#039;a pas accepté le CLUF pour AccessChk, ne peut pas continuer&quot;        Pause        # Principaux que nous voulons rechercher    $ RiskPrincipals = @ (            &#039;Toutes les personnes&#039;,            «Utilisateurs du domaine»,            «Ordinateurs de domaine»,            &#039;Utilisateurs authentifiés&#039;,            &#039;Utilisateurs&#039;    )    # Liste des partages que nous voulons ignorer.    # Définir un nom de partage lié juste au cas où, car il devrait presque toujours être ce chemin    $ IgnoreShares = @ (            &#039;print $&#039;    )    # Scriptblock que nous enverrons avec Invoke-Command    $ Scriptblock = {            $ RiskPrincipals = $ args[0].RiskPrincipals            $ IgnoreShares = $ args[1].IgnoreShares            $ AcceptEula = $ args[2].AccepterEula            # Fonctions pour télécharger et utiliser AccessChk            # Il utilise un objet shell au lieu de Expand-Archive pour une compatibilité descendante            Fonction Download-AccessChk                     param (                            $ Url = &quot;https://download.sysinternals.com/files/AccessChk.zip&quot;,                            $ Dest = $ env: temp                    )                    if (Test-Path &quot;$ dest  accesschk.zip&quot;)                             rm $ Dest  AccessCHK.zip -Force                                        (New-Object System.Net.WebClient) .DownloadFile ($ url, &quot;$ env: temp  AccessChk.zip&quot;)                    $ Shell = New-Object -ComObject Shell.Application                    $ Zip = $ shell.NameSpace (&quot;$ env: temp  AccessChk.zip&quot;)                    $ Destination = $ shell.NameSpace (&quot;$ env: windir  system32 &quot;)                    $ copyFlags = 0x00                    $ copyFlags + = 0x04                    $ copyFlags + = 0x10                    $ Destination.CopyHere ($ Zip.Items (), $ copyFlags)                        # La fonction qui utilise accesschk de la partie 2            Fonction Invoke-AccessChk {                    param (                            $ Path,                            $ Directeurs,                            $ AccessChkPath = &quot;$ env: windir  system32  accesschk64.exe&quot;,              [switch]$ Répertoires              [switch]$ AcceptEula                              )                    if (! (Test-Path &quot;$ env: windir  system32  accesschk64.exe&quot;))                             Download-AccessChk                                        # Accepter le CLUF                     if ($ AcceptEula)                             &amp; $ AccessChkPath / accepteula                     $ Argument = &quot;uqs&quot;                    if ($ DirectoriesOnly)                             $ Argument = &quot;udqs&quot;                                        $ Output = &amp; $ AccessChkPath -nobanner - $ Argument $ Path                          Foreach ($ Row dans $ Output)                             # Si c&#039;est une ligne avec un chemin de fichier, sortez l&#039;objet précédent et créez-en un nouveau                            if ($ Row -match &quot;^  S&quot;)                                     If ($ Null -ne $ Object)                                             if ($ Object.Access.Keys.Count -gt 0)                                                     $ Object                                                                                                                    $ Object = [PSCustomObject]@                                             Chemin = $ Ligne                                            Accès = @                                                                                             # S&#039;il s&#039;agit d&#039;une ligne avec des autorisations                            if ($ Row -match &quot;^  [R ][W ]&quot;) &quot;))  Out-Null                                                                      $ Object.Access[$Matches.Principal] = @                                                     Read = $ Matches.Read -eq &#039;R&#039;                                                    Write = $ Matches.Read -eq &#039;W&#039;                                                                                                                                                    # Si c&#039;est la dernière ligne - sortez l&#039;objet une fois de plus                    if ($ Object.Access.Keys.Count -gt 0)                             $ Object                                }            # Obtenez tous les partages en utilisant WMI            $ Shares = Get-WmiObject -Class win32_share            # Créez un objet que nous reviendrons plus tard lorsque nous aurons terminé            $ ReturnObject = [PSCustomObject]@                     ComputerName = $ ComputerName                    NetworkShares = [System.Collections.Generic.List[PSCustomObject]]::Nouveau()                    AccessibleObjects = @                         # Ignorez les partages par défaut en filtrant &#039;2147483648&#039;            # Ignorer les parts de $ IgnoreShares            foreach ($ Part en $ Actions |? $ _. Tapez -ne &#039;2147483648&#039; |? $ _. Nom -notin $ IgnoreShares) {                    $ ShareObject = [PSCustomObject]@                             Nom = $ Share.Name                            Description = $ Share.Description                            LocalPath = $ Share.Path                            ACL = [System.Collections.ArrayList]::Nouveau()                                        $ ShareSecurity = Get-WMIObject -Class Win32_LogicalShareSecuritySetting -Filter &quot;name = &#039;$ ($ Share.Name)&#039;&quot; &quot;                    if ($ Null -ne $ ShareSecurity) {                            Essayer                                      $ SecurityDescriptor = $ ShareSecurity.GetSecurityDescriptor (). Descriptor                                                  foreach ($ AccessControl dans $ SecurityDescriptor.DACL)  Out-Null                                                                        # Ajouter un partage réseau uniquement s&#039;il contient un utilisateur / groupe à risque                                                  $ Match = $ False                                    Foreach ($ IdentityReference dans $ ShareObject.ACL.IdentityReference.Value)                                             Foreach ($ Pattern in $ RiskPrincipals)                                                     if ($ IdentityReference -Match $ Pattern)                                                                            $ Match = $ True                                                                                                                                                                        if ($ Match)                                             $ ReturnObject.NetworkShares.Add ($ ShareObject)                                                                            Autre                                             Write-Verbose &quot;Aucune correspondance pour les groupes à risque, n&#039;ajoutant pas&quot;                                                                                                             Capture                                    Erreur d&#039;écriture $ Erreur[0]                                                }                    Autre                             Write-Information &quot;Aucune autorisation trouvée pour $ ($ Share.Name) sur $ ComputerName&quot;                                        }            # Obtenez tous les fichiers de NetworkShares où un principal de $ RiskPrincipals a un accès en lecture ou en écriture            $ ReturnObject.NetworkShares | Pour chaque                     $ ReturnObject.AccessibleObjects[$_.Name] = Invoke-AccessChk -Path $ _. LocalPath -Principals $ RiskPrincipals -AcceptEula: $ AcceptEula                        # Terminé! Permet de renvoyer l&#039;objet de retour:            $ ReturnObject    }    # À ajouter à la liste d&#039;arguments d&#039;Invoke-Job car le travail PowerShell distant n&#039;a pas accès à notre espace variable.    $ InvokeParam = @             RiskPrincipals = $ RiskPrincipals            IgnoreShares = $ IgnoreShares            AcceptEula = $ AcceptEULA        # Commencer les travaux    $ Job = Invoke-Command -AsJob -ComputerName $ Computers -ArgumentList $ InvokeParam -ScriptBlock $ Scriptblock    # Attendez la fin des travaux    $ Job | Wait-Job    # Collecte des données de tous les travaux    $ Output = Get-Job | Receive-Job    # Sortie de la sortie dans un CSV    $ ToCSV = Foreach ($ Résultat dans $ Output) {            Foreach ($ Entrez $ Result.AccessibleObjects.Keys)  Sélectionnez @ Name = &#039;ShareName&#039;; Expression = $ Key, Path, $ ReadAccess, $ WriteAccess                }    # Exporter le CSV    $ ToCSV | Export-Csv -Path.  ShareAccessReport.csv\nLorsque le travail PowerShell se termine, il crée un rapport complet de l&#039;accès des principaux dans le $ RiskyPrincipals    variable.</p>"},{"id":"text-7","type":"text","heading":"","plain_text":"Correction des autorisations de partage Windows\nAprès avoir examiné le CSV et trouvé les autorisations qui doivent être ajustées, il existe deux façons de les corriger. S&#39;il n&#39;y en a que quelques-uns, le meilleur moyen est d&#39;utiliser l&#39;interface graphique. Mais s&#39;il y en a des milliers, la commande suivante utilisera la sortie CSV pour accélérer cela:\n# Cela doit s&#39;exécuter localement sur le serveur avec le partage de fichiers.    $ UserToRemove = &#39;Invité&#39;    $ CSV = Import-Csv -Path.  ShareAccessReport.csv | ?     $ CSV | ? $ _. ComputerName -eq $ env: COMPUTERNAME | Pour chaque             $ ACL = Get-Acl -Path $ _. Path            $ ACL.Access \nCe script PowerShell supprimera toutes les autorisations du principal de sécurité invité.\nLe premier rapport apportera généralement beaucoup de travail car il découvrira beaucoup de bizarreries et de risques en ce qui concerne vos autorisations de partage Windows. Mais la gestion régulière d&#39;une solution comme celle-ci, spécialement destinée aux partages contenant des informations sensibles, sera finalement payante.","html":"<p>Correction des autorisations de partage Windows\nAprès avoir examiné le CSV et trouvé les autorisations qui doivent être ajustées, il existe deux façons de les corriger. S&#039;il n&#039;y en a que quelques-uns, le meilleur moyen est d&#039;utiliser l&#039;interface graphique. Mais s&#039;il y en a des milliers, la commande suivante utilisera la sortie CSV pour accélérer cela:\n# Cela doit s&#039;exécuter localement sur le serveur avec le partage de fichiers.    $ UserToRemove = &#039;Invité&#039;    $ CSV = Import-Csv -Path.  ShareAccessReport.csv | ?     $ CSV | ? $ _. ComputerName -eq $ env: COMPUTERNAME | Pour chaque             $ ACL = Get-Acl -Path $ _. Path            $ ACL.Access \nCe script PowerShell supprimera toutes les autorisations du principal de sécurité invité.\nLe premier rapport apportera généralement beaucoup de travail car il découvrira beaucoup de bizarreries et de risques en ce qui concerne vos autorisations de partage Windows. Mais la gestion régulière d&#039;une solution comme celle-ci, spécialement destinée aux partages contenant des informations sensibles, sera finalement payante.</p>"},{"id":"text-8","type":"text","heading":"","plain_text":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]","html":"<p>Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]</p>"}],"sections":[{"id":"text-1","heading":"Text","content":"Garder vos données en sécurité et à l&#39;abri des utilisateurs non autorisés est une tâche complexe, qui peut être encore plus difficile si un paramètre par défaut dans Windows vous gêne.\nEssayer de sécuriser les autorisations de partage Windows est un gros défi en raison d&#39;un paramètre appelé contournement de la vérification qui vérifie que le système d&#39;exploitation est activé par défaut. Ce paramètre donne accès aux dossiers même si l&#39;utilisateur n&#39;a de droits d&#39;accès à aucun de ses parents.\nNous pouvons supprimer cette autorisation avec le paramètre d&#39;objet de stratégie de groupe, mais elle est là pour une raison. Sans ce paramètre activé, vous constaterez une baisse importante des performances car Windows vérifiera chaque dossier parent pour voir si l&#39;utilisateur est autorisé à accéder à la cible.\nCet article explique comment créer un rapport sur les autorisations de partage Windows pour déterminer quels utilisateurs ont des autorisations excessives et comment le réparer à l&#39;aide de PowerShell et de Sysinternals."},{"id":"text-2","heading":"Text","content":"Rassembler les partages de fichiers et leurs utilisateurs autorisés\nTout d&#39;abord, nous devons trouver les partages de fichiers sur les serveurs et les systèmes clients. Nous pourrions le faire soit en utilisant le Get-SmbShare    ou en appelant l&#39;espace de noms win32_share à l&#39;aide de Get-CimInstance    ou Get-WmiObject.\nPour cet exemple, Get-WmiObject    est le moyen préféré de récupérer nos actions, car il s&#39;agit d&#39;une approche plus rationalisée. Lancez le terminal PowerShell en tant qu&#39;administrateur sur un serveur de fichiers et entrez la commande suivante:\nGet-WMIObject -Class win32_shareNom Chemin Description    ---- ---- -----------    MyShare C:  demo  share Partage de démonstration                    ADMIN $ C:  Administrateur distant WINDOWS   C C:                                               C $ C:  Partage par défaut  D $ D:  Partage par défaut  E $ E:  Partage par défaut  IPC $ IPC distant     imprimer $ C:  WINDOWS  system32  spool  drivers Pilotes d&#39;imprimantescripts C:  scripts\nLa commande PowerShell génère tous les partages, mais elle ne montre pas aux utilisateurs qui y ont accès. En effet, les autorisations de partage Windows résident dans un autre espace de noms appelé Win32_LogicalShareSecuritySetting:\nGet-WmiObject -Class Win32_LogicalShareSecuritySetting\nCette sortie résultante ne nous dit pas grand-chose non plus. Nous avons besoin d&#39;un script PowerShell plus complet pour générer quelque chose de plus utile:\n# Obtenez tous les partages sur l&#39;ordinateur    $ Shares = Get-WMIObject -Class win32_share    # Variable aux actions traitées.    $ NetworkShares = [System.Collections.Generic.List[PSCustomObject]]::Nouveau()    # Ignorez les partages par défaut en filtrant &#39;2147483648&#39;    foreach ($ Part en $ Actions |? $ _. Tapez -ne &#39;2147483648&#39; -et $ _. Nom -ne &#39;print $&#39;) {            # Créez un objet que nous retournerons            $ ShareObject = [PSCustomObject]@                     Nom = $ Share.Name                    Description = $ Share.Description                    LocalPath = $ Share.Path                    ACL = [System.Collections.ArrayList]::Nouveau()                        # Obtenez les paramètres de sécurité pour le partage            $ ShareSecurity = Get-WmiObject -Class Win32_LogicalShareSecuritySetting -Filter &quot;name = &#39;$ ($ Share.Name)&#39;&quot; &quot;            # Si des paramètres de sécurité existent, créez une liste avec les ACL            if ($ Null -ne $ ShareSecurity)                     Essayer                              $ SecurityDescriptor = $ ShareSecurity.GetSecurityDescriptor (). Descriptor                                          foreach ($ AccessControl dans $ SecurityDescriptor.DACL)  Out-Null                                                        # Renvoyer l&#39;objet de partage avec les ACL                            $ NetworkShares.Add ($ ShareObject)                                        Capture                            Erreur d&#39;écriture $ Erreur[0]                                            Autre                     Write-Information &quot;Aucune autorisation trouvée pour $ ($ Share.Name) sur $ ComputerName&quot;                }\nLe contenu du $ NetworkShares    La variable devrait finir par ressembler à ce qui suit:\nPS51&gt; $ NetworkSharesNom Description LocalPath ACL                                                                                                         ---- ----------- --------- ---                                                                                                         DemoShare Demo share C:  demo  share System.Security.AccessControl.FileSystemAccessRule                                                        scripts C:  scripts System.Security.AccessControl.FileSystemAccessRule, System.Security.AccessControl.FileSystemAccessRule    PS51&gt; $ NetworkShares[0].ACL    FileSystemRights: FullControl    AccessControlType: Autoriser    IdentityReference: Tout le monde    IsInherited: False    InheritanceFlags: Aucun    PropagationFlags: Aucun\nNous avons réussi à collecter des données sur nos autorisations de partage Windows, montrant qui a accès à quoi. Cela peut ne pas être suffisant car les administrateurs attribuent généralement des autorisations de partage réseau au niveau NTFS, pas au niveau du partage réseau.\nNous devons également vérifier les fichiers et dossiers du partage s&#39;il existe des autorisations excessives pour d&#39;autres groupes, tels que Tout le monde ou Utilisateurs de domaine."},{"id":"text-3","heading":"Text","content":"Analyse des autorisations de fichiers à l&#39;aide d&#39;AccessChk\nNous avons une liste de nos partages de fichiers. Ensuite, nous devons obtenir toutes les autorisations de fichier. La méthode la plus rapide consiste à utiliser l&#39;utilitaire de fichiers AccessChk de la suite Sysinternals et à analyser la sortie avec PowerShell.\nPlacez AccessChk sur votre serveur de fichiers et copiez le fichier AccessChk64.exe dans votre dossier system32. Vous pouvez télécharger l&#39;utilitaire à partir du lien ci-dessus ou utiliser le code PowerShell suivant pour le télécharger et le copier dans votre dossier system32:\nInvoke-WebRequest -OutFile $ env: TEMP  AccessChk.zip -Uri https://download.sysinternals.com/files/AccessChk.zip     Expand-Archive -Path $ env: TEMP  AccessChk.zip -DestinationPath $ env: TEMP -Force    Copy-Item -Path $ env: TEMP  AccessChk64.exe C:  Windows  System32  AccessChk64.exe\nNous pouvons utiliser PowerShell pour créer une fonction wrapper autour d&#39;AccessChk à utiliser dans un script:\nFonction Invoke-AccessChk {            param (                    $ Path,                    $ Directeurs,                    $ AccessChkPath = &quot;$ env: windir  system32  accesschk64.exe&quot;,          [switch]$ Répertoires          [switch]$ AcceptEula                      )            # Accepter le CLUF             if ($ AcceptEula)                     &amp; $ AccessChkPath / accepteula             $ Argument = &quot;uqs&quot;            if ($ DirectoriesOnly)                     $ Argument = &quot;udqs&quot;                        $ Output = &amp; $ AccessChkPath -nobanner - $ Argument $ Path                  Foreach ($ Row dans $ Output)                     # Si c&#39;est une ligne avec un chemin de fichier, sortez l&#39;objet précédent et créez-en un nouveau                    if ($ Row -match &quot;^  S&quot;)                             If ($ Null -ne $ Object)                                     if ($ Object.Access.Keys.Count -gt 0)                                             $ Object                                                                                            $ Object = [PSCustomObject]@                                     Chemin = $ Ligne                                    Accès = @                                                                     # S&#39;il s&#39;agit d&#39;une ligne avec des autorisations                    if ($ Row -match &quot;^  [R ][W ]&quot;) &quot;))                                     $ Row -match &quot;^ (?[R ]) (?[W ]) (?. *) &quot;                                            # Si c&#39;est la dernière ligne - sortez l&#39;objet une fois de plus            if ($ Object.Access.Keys.Count -gt 0)                     $ Object                }\nNous pouvons maintenant courir Invoke-AccessChk    avec les partages réseau stockés dans le $ NetworkShares    variable de l&#39;étape précédente. Nous ajoutons à une liste des principaux de sécurité &#8211; sans &quot;domaine&quot; &#8211; pour trouver:\n# Invoke-AccessChk ne sortira que les fichiers / dossiers où les principaux suivants ont l&#39;autorisation:    $ RiskPrincipals = @ (            &#39;Toutes les personnes&#39;,            «Utilisateurs du domaine»,            «Ordinateurs de domaine»,            &#39;Utilisateurs authentifiés&#39;,            &#39;Utilisateurs&#39;    )    $ RiskyPermissions = Foreach ($ NetworkShare in $ NetworkShares | Select -First 1) ? $ _ -In $ RiskPrincipals)                  if ($ RiskPrincipalExist)                     Invoke-AccessChk -Path $ NetworkShare.LocalPath -Principals $ RiskPrincipals                \nle $ RiskyPermissions    La variable donnera une sortie similaire à ceci:\nPS51&gt; $ RiskyPermissions    Accès au chemin                                               ---- ------                                               C:  demo  share  File1.txt BUILTIN  Users, NT AUTHORITY  Authenticated Users    C:  demo  share  Folder1  picture.png AUTORITÉ NT  Utilisateurs authentifiés                   C:  demo  share  Folder1  Folder2 AUTORITÉ NT  Utilisateurs authentifiés    PS51&gt; $ RiskyPermissions[0].Accès"},{"id":"text-4","heading":"Text","content":"Création d&#39;un rapport à partir de plusieurs ordinateurs et serveurs\nJusqu&#39;à présent, vous pouvez obtenir une liste de tous les partages de fichiers et vérifier tous les fichiers avec le wrapper PowerShell pour Invoke-AccessChk. L&#39;une des nombreuses forces de PowerShell est sa capacité à évoluer. La communication à distance PowerShell portera le code que nous avons produit au niveau supérieur pour recueillir les informations de plusieurs ordinateurs à la fois.\nTout d&#39;abord, nous avons besoin d&#39;une liste d&#39;ordinateurs et de serveurs à analyser. Si possible, le moyen le plus simple consiste à utiliser le module Active Directory de RSAT:\n$ Computers = (Get-ADComputer -Filter *). DnsHostName\nCette méthode n&#39;est peut-être pas une option dans les environnements plus vastes fortement segmentés. Une autre approche consiste à obtenir des données de votre base de données de gestion de configuration ou à les saisir manuellement à l&#39;aide de l&#39;exemple suivant:\n$ Ordinateurs = @ (            &#39;Server1&#39;,            «Server2»,            «Server3»,            «Server4»,            «Server5»,        «PC1»        # etc    )\nIl est maintenant temps de lier tous ces composants dans un script qui utilise des travaux d&#39;arrière-plan PowerShell pour effectuer les actions suivantes sur les machines spécifiées dans le $ Ordinateurs paramètre:"},{"id":"text-5","heading":"Text","content":"Obtenez tous les partages partagés avec l&#39;un des principaux dans $ RiskPrincipals.\nTéléchargez AccessChk s&#39;il n&#39;existe pas déjà.\nVérifiez l&#39;autorisation NTFS de tous les partages rassemblés par AccessChk.\nRenvoyer un objet avec une liste avec tous les fichiers où les principaux de sécurité dans $ RiskPrincipals    avoir des autorisations de lecture ou d&#39;écriture."},{"id":"text-6","heading":"Text","content":"L&#39;ordinateur exécutant le script collectera ensuite les résultats de tous les travaux et les affichera dans un fichier CSV portant le nom ShareAccessReport.\nN&#39;oubliez pas d&#39;exécuter ce qui suit en tant qu&#39;administrateur sur un ordinateur disposant d&#39;un accès réseau auxdites machines et d&#39;accepter le CLUF pour AccessChk en modifiant $ AcceptEula    à vrai:\n$ Ordinateurs = @ (            «Serveur-1»,            «Serveur-2»,            «PC-1»    )    # Accepter le CLUF pour AccessChk    # CHANGER EN VRAI    $ AcceptEula = $ false    if (! $ AcceptEula)             Write-Warning &quot;N&#39;a pas accepté le CLUF pour AccessChk, ne peut pas continuer&quot;        Pause        # Principaux que nous voulons rechercher    $ RiskPrincipals = @ (            &#39;Toutes les personnes&#39;,            «Utilisateurs du domaine»,            «Ordinateurs de domaine»,            &#39;Utilisateurs authentifiés&#39;,            &#39;Utilisateurs&#39;    )    # Liste des partages que nous voulons ignorer.    # Définir un nom de partage lié juste au cas où, car il devrait presque toujours être ce chemin    $ IgnoreShares = @ (            &#39;print $&#39;    )    # Scriptblock que nous enverrons avec Invoke-Command    $ Scriptblock = {            $ RiskPrincipals = $ args[0].RiskPrincipals            $ IgnoreShares = $ args[1].IgnoreShares            $ AcceptEula = $ args[2].AccepterEula            # Fonctions pour télécharger et utiliser AccessChk            # Il utilise un objet shell au lieu de Expand-Archive pour une compatibilité descendante            Fonction Download-AccessChk                     param (                            $ Url = &quot;https://download.sysinternals.com/files/AccessChk.zip&quot;,                            $ Dest = $ env: temp                    )                    if (Test-Path &quot;$ dest  accesschk.zip&quot;)                             rm $ Dest  AccessCHK.zip -Force                                        (New-Object System.Net.WebClient) .DownloadFile ($ url, &quot;$ env: temp  AccessChk.zip&quot;)                    $ Shell = New-Object -ComObject Shell.Application                    $ Zip = $ shell.NameSpace (&quot;$ env: temp  AccessChk.zip&quot;)                    $ Destination = $ shell.NameSpace (&quot;$ env: windir  system32 &quot;)                    $ copyFlags = 0x00                    $ copyFlags + = 0x04                    $ copyFlags + = 0x10                    $ Destination.CopyHere ($ Zip.Items (), $ copyFlags)                        # La fonction qui utilise accesschk de la partie 2            Fonction Invoke-AccessChk {                    param (                            $ Path,                            $ Directeurs,                            $ AccessChkPath = &quot;$ env: windir  system32  accesschk64.exe&quot;,              [switch]$ Répertoires              [switch]$ AcceptEula                              )                    if (! (Test-Path &quot;$ env: windir  system32  accesschk64.exe&quot;))                             Download-AccessChk                                        # Accepter le CLUF                     if ($ AcceptEula)                             &amp; $ AccessChkPath / accepteula                     $ Argument = &quot;uqs&quot;                    if ($ DirectoriesOnly)                             $ Argument = &quot;udqs&quot;                                        $ Output = &amp; $ AccessChkPath -nobanner - $ Argument $ Path                          Foreach ($ Row dans $ Output)                             # Si c&#39;est une ligne avec un chemin de fichier, sortez l&#39;objet précédent et créez-en un nouveau                            if ($ Row -match &quot;^  S&quot;)                                     If ($ Null -ne $ Object)                                             if ($ Object.Access.Keys.Count -gt 0)                                                     $ Object                                                                                                                    $ Object = [PSCustomObject]@                                             Chemin = $ Ligne                                            Accès = @                                                                                             # S&#39;il s&#39;agit d&#39;une ligne avec des autorisations                            if ($ Row -match &quot;^  [R ][W ]&quot;) &quot;))  Out-Null                                                                      $ Object.Access[$Matches.Principal] = @                                                     Read = $ Matches.Read -eq &#39;R&#39;                                                    Write = $ Matches.Read -eq &#39;W&#39;                                                                                                                                                    # Si c&#39;est la dernière ligne - sortez l&#39;objet une fois de plus                    if ($ Object.Access.Keys.Count -gt 0)                             $ Object                                }            # Obtenez tous les partages en utilisant WMI            $ Shares = Get-WmiObject -Class win32_share            # Créez un objet que nous reviendrons plus tard lorsque nous aurons terminé            $ ReturnObject = [PSCustomObject]@                     ComputerName = $ ComputerName                    NetworkShares = [System.Collections.Generic.List[PSCustomObject]]::Nouveau()                    AccessibleObjects = @                         # Ignorez les partages par défaut en filtrant &#39;2147483648&#39;            # Ignorer les parts de $ IgnoreShares            foreach ($ Part en $ Actions |? $ _. Tapez -ne &#39;2147483648&#39; |? $ _. Nom -notin $ IgnoreShares) {                    $ ShareObject = [PSCustomObject]@                             Nom = $ Share.Name                            Description = $ Share.Description                            LocalPath = $ Share.Path                            ACL = [System.Collections.ArrayList]::Nouveau()                                        $ ShareSecurity = Get-WMIObject -Class Win32_LogicalShareSecuritySetting -Filter &quot;name = &#39;$ ($ Share.Name)&#39;&quot; &quot;                    if ($ Null -ne $ ShareSecurity) {                            Essayer                                      $ SecurityDescriptor = $ ShareSecurity.GetSecurityDescriptor (). Descriptor                                                  foreach ($ AccessControl dans $ SecurityDescriptor.DACL)  Out-Null                                                                        # Ajouter un partage réseau uniquement s&#39;il contient un utilisateur / groupe à risque                                                  $ Match = $ False                                    Foreach ($ IdentityReference dans $ ShareObject.ACL.IdentityReference.Value)                                             Foreach ($ Pattern in $ RiskPrincipals)                                                     if ($ IdentityReference -Match $ Pattern)                                                                            $ Match = $ True                                                                                                                                                                        if ($ Match)                                             $ ReturnObject.NetworkShares.Add ($ ShareObject)                                                                            Autre                                             Write-Verbose &quot;Aucune correspondance pour les groupes à risque, n&#39;ajoutant pas&quot;                                                                                                             Capture                                    Erreur d&#39;écriture $ Erreur[0]                                                }                    Autre                             Write-Information &quot;Aucune autorisation trouvée pour $ ($ Share.Name) sur $ ComputerName&quot;                                        }            # Obtenez tous les fichiers de NetworkShares où un principal de $ RiskPrincipals a un accès en lecture ou en écriture            $ ReturnObject.NetworkShares | Pour chaque                     $ ReturnObject.AccessibleObjects[$_.Name] = Invoke-AccessChk -Path $ _. LocalPath -Principals $ RiskPrincipals -AcceptEula: $ AcceptEula                        # Terminé! Permet de renvoyer l&#39;objet de retour:            $ ReturnObject    }    # À ajouter à la liste d&#39;arguments d&#39;Invoke-Job car le travail PowerShell distant n&#39;a pas accès à notre espace variable.    $ InvokeParam = @             RiskPrincipals = $ RiskPrincipals            IgnoreShares = $ IgnoreShares            AcceptEula = $ AcceptEULA        # Commencer les travaux    $ Job = Invoke-Command -AsJob -ComputerName $ Computers -ArgumentList $ InvokeParam -ScriptBlock $ Scriptblock    # Attendez la fin des travaux    $ Job | Wait-Job    # Collecte des données de tous les travaux    $ Output = Get-Job | Receive-Job    # Sortie de la sortie dans un CSV    $ ToCSV = Foreach ($ Résultat dans $ Output) {            Foreach ($ Entrez $ Result.AccessibleObjects.Keys)  Sélectionnez @ Name = &#39;ShareName&#39;; Expression = $ Key, Path, $ ReadAccess, $ WriteAccess                }    # Exporter le CSV    $ ToCSV | Export-Csv -Path.  ShareAccessReport.csv\nLorsque le travail PowerShell se termine, il crée un rapport complet de l&#39;accès des principaux dans le $ RiskyPrincipals    variable."},{"id":"text-7","heading":"Text","content":"Correction des autorisations de partage Windows\nAprès avoir examiné le CSV et trouvé les autorisations qui doivent être ajustées, il existe deux façons de les corriger. S&#39;il n&#39;y en a que quelques-uns, le meilleur moyen est d&#39;utiliser l&#39;interface graphique. Mais s&#39;il y en a des milliers, la commande suivante utilisera la sortie CSV pour accélérer cela:\n# Cela doit s&#39;exécuter localement sur le serveur avec le partage de fichiers.    $ UserToRemove = &#39;Invité&#39;    $ CSV = Import-Csv -Path.  ShareAccessReport.csv | ?     $ CSV | ? $ _. ComputerName -eq $ env: COMPUTERNAME | Pour chaque             $ ACL = Get-Acl -Path $ _. Path            $ ACL.Access \nCe script PowerShell supprimera toutes les autorisations du principal de sécurité invité.\nLe premier rapport apportera généralement beaucoup de travail car il découvrira beaucoup de bizarreries et de risques en ce qui concerne vos autorisations de partage Windows. Mais la gestion régulière d&#39;une solution comme celle-ci, spécialement destinée aux partages contenant des informations sensibles, sera finalement payante."},{"id":"text-8","heading":"Text","content":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"}],"media":{"primary_image":"https://tutos-gameserver.fr/wp-content/uploads/2019/05/cloudapplications_article_012.jpg"},"relations":[{"rel":"canonical","href":"https://tutos-gameserver.fr/2020/05/04/rechercher-et-verrouiller-les-autorisations-de-partage-windows-laxistes-bien-choisir-son-serveur-d-impression/"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2020/05/04/rechercher-et-verrouiller-les-autorisations-de-partage-windows-laxistes-bien-choisir-son-serveur-d-impression/llm","type":"text/html"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2020/05/04/rechercher-et-verrouiller-les-autorisations-de-partage-windows-laxistes-bien-choisir-son-serveur-d-impression/llm.json","type":"application/json"},{"rel":"llm-manifest","href":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","type":"application/json"}],"http_headers":{"X-LLM-Friendly":"1","X-LLM-Schema":"1.1.0","Content-Security-Policy":"default-src 'none'; img-src * data:; style-src 'unsafe-inline'"},"license":"CC BY-ND 4.0","attribution_required":true,"allow_cors":false}