07 Feb 2022, 00:00

Gestion fine de la stratégie de mot de passe sur un AD

Sous Windows Server, la stratégie de mot de passe gérée par les GPO est commune à tous les utilisateurs.

À partir de Windows Server 2008 (et 2012 pour l’interface graphique, il me semble), si on veut définir des stratégies plus fines, on peut le faire en passant par les PSO (Password Settings Objects).
Il faut d’abord créer un groupe de sécurité, et y placer les utilisateurs concernés.
Ensuite, ouvrir le Active Directory Admin Center (ADAC) :
dsac.exe
Aller dans domain (local) -> System -> Password Settings Container et faire clic-droit -> Nouveau -> Paramètres de mot de passe.
Donner un nom et une priorité (1 = la + élevée) à la stratégie, régler les paramètres désirés, et choisir le groupe de sécurité précedemment créé dans “S’applique directement à”.

Une fois le PSO créé, il devrait s’appliquer correctement, uniquement aux utilisateurs positionnés dans le groupe, en étant prioritaire par rapport à la stratégie par défaut.

31 Jan 2022, 00:00

Compatibilité DDR DDR-L

La mémoire DDRxL est prévue pour fonctionner à plus bas voltage que la DDRx (par exemple 1.35V pour la DDR3L contre 1.5V pour la DDR3).
Elle est toutefois capable de fonctionner à voltage “complet”.

Donc, la DDRxL peut être mise à la place de la DDRx, mais pas l’inverse. Il faut toutefois, sur une même carte-mère, que toutes les barrettes soient du même type (?).
Pour que le système fonctionne en voltage bas, il faut que l’ensemble des composants le supporte.

31 Jan 2022, 00:00

Permissions des disques VHD/VHDX

Dans Hyper-V, si on crée un disque virtuel, et qu’on l’attribue à une VM dans un 2nd temps, il est possible qu’elle ne puiss pas démarrer avec le message “Erreur d’accès général refusé” concernant le fichier VHD.

Ceci est parce que chaque VM est un objet de sécurité, et qu’il faut lui affecter les autorisation correctes sur le fichier disque. Pour ceci, lancer Powershell, et obtenir le SID de la VM :
Get-VM 'Mon serveur virtuel' | Select-Object VMID (en entrant le nom de la VM).
Puis lui donner les droits sur le fichier :
icacls hard-disk.vhdx /grant %SID%:F (en entrant le SID trouvé ci-dessus).

La VM devrait alors pouvoir démarrer.

Source

27 Jan 2022, 00:00

Gestion des certificats sous Windows

certmgr.msc pour voir les ceertificats de l’utilisateur actuel
certlm.msc pour voir les certificats de la machine elle-même (bureau à distance, etc.)

Pour voir à quel certificat correspond un hachage précis, on peut aller dans Actions -> Rechercher des certificats, choisir “Tous les magasins de certificats”, rechercher dans le champ “Hachage SHA1” et entrer le hash dans le champ “Contenu”.

Les certificats expirés pour l’authentification des clients (Magasin ordinateur -> Personnel -> Certificats) ne semblent pas se supprimer tout seuls après leur expiration, ce qui crée un Evt 64 dans l’observateur d’événement. On peut les supprimer manuellement.

05 Jan 2022, 00:00

Autoriser l'accès à un partage réseau sans authentification depuis Windows Server 2019

Depuis Windows Server 2019, l’accès aux dossiers partagés (sur un autre serveur) qui ne nécessitent pas d’authentification est désactivé.
Pour le réactiver, il faut aller dans gpedit.msc, et aller dans Configuration ordinateur -> Modèles d'administration -> Réseau -> Station de travail LANMAN et activer le paramètre Activer les ouvertures de session invité non sécurisées.

Probablement faisable via gpmc.msc dans le cas d’un domaine.

Source

Possible via regedit aussi ?

15 Oct 2021, 00:00

Invite de commande Windows

Création de fichier .bat contenant des accents

Éditer le fichier avec Notepad++, et choisir dans le menu Encodage -> Codage de caractères -> Langues d'Europe occidentale -> OEM 850. Si les accents avaient été entrés avant la conversion, ils ont été remplacés par d’autres caractères, il faut donc les réécrire correctement.

Split d’une commande sur plusieurs lignes pour la lisibilité

Il faut échapper le retour à la ligne par un circonflexe ^ . Il semble qu’il faille faire commencer la ligne suivante par un espace, car le premier caractère ne sera pas pris en compte (non vérifié).

14 Sep 2021, 00:00

Création d'un ISO Windows personnalisé

2 sources qui m’ont aidé :
https://theitbros.com/sysprep-windows-machine/
https://www.ac-nantes.fr/medias/fichier/procedure-image-de-reference-multiplateforme_1433950335218-pdf

Entrer en mode d’audit

Sur une install, rentrer en mode audit :

c:\Windows\System32\sysprep\sysprep.exe /audit

ou Ctrl-Maj-F3 sur l’écran de choix de langue lors de l’OOBE (configuration du hostname, utilisteur etc…)

Ceci redémarre sur une session Administrateur. Sur la fenetre qui s’ouvre, faire Cancel pour personnaliser l’image.

Personnalisation de l’image

  • Install/update des pilotes (si c’est la même machine que la destination)
  • install des logiciels souhaités (navigateur, ccleaner, vlc etc…)
  • Télémetrie :
sc delete DiagTrack
sc delete dmwappushservice
echo ““ > C:\ProgramData\Microsoft\Diagnosis\ETLLogs\AutoLogger\AutoLogger-DiagTrack-Listener.etl
reg add “HKLM\SOFTWARE\Policies\Microsoft\Windows\DataCollection” /v AllowTelemtery /t REG_DWORD /d 0 /f

et DisableWinTracking

  • Remove buit-in apps (powershell)
Get-AppxPackage *3dbuilder* | Remove-AppxPackage
Get-AppxPackage *windowsalarms* | Remove-AppxPackage
Get-AppxPackage *windowscommunicationsapps* | Remove-AppxPackage
Get-AppxPackage *officehub* | Remove-AppxPackage
Get-AppxPackage *skypeapp* | Remove-AppxPackage
Get-AppxPackage *getstarted* | Remove-AppxPackage
Get-AppxPackage *zunemusic* | Remove-AppxPackage
Get-AppxPackage *windowsmaps* | Remove-AppxPackage
Get-AppxPackage *solitairecollection* | Remove-AppxPackage
Get-AppxPackage *bingfinance* | Remove-AppxPackage
Get-AppxPackage *zunevideo* | Remove-AppxPackage
Get-AppxPackage *bingnews* | Remove-AppxPackage
Get-AppxPackage *onenote* | Remove-AppxPackage
Get-AppxPackage *people* | Remove-AppxPackage
Get-AppxPackage *windowsphone* | Remove-AppxPackage
Get-AppxPackage *bingsports* | Remove-AppxPackage
Get-AppxPackage *bingweather* | Remove-AppxPackage
Get-AppxPackage *xbox* | Remove-AppxPackage
Get-AppxPackage *yourphone* | Remove-AppxPackage
Get-AppxPackage *feedback* | Remove-AppxPackage
Get-AppxPackage *microsoft.wallet* | Remove-AppxPackage
Get-AppxPackage *spotify* | Remove-AppxPackage
C:\Windows\SysWOW64\OneDriveSetup.exe /uninstall
  • Chocolatey pour install office
    choco install office365business

Création de l’image

Exécuter : sysprep
Enter OOBE ; Generalize ; Shutdown
Ceci permet de définir l’action au prochain démarrage du système (rentrer en mode OOBE pour paramétrage des users etc), de généraliser l’image (enlever toutes les informations/pilotes spécifiques au matériel utilisé), et demande à redémarrer immédiatement.

Nous avons donc une installation contenant les logiciels et personnalisations nécessaires, sans information de matériel ou d’utilisateurs, qui rentrera en mode OOBE à son prochain démarrage.
Il faut maintenant créér une image pour pouvoir installer cette image. Pour ceci :

Brancher le disque sur une installation fonctionnelle de Windows. Si aucune disponible, ceci peut se faire depuis le DVD d’install de Windows (Réparer l’ordi -> invite de commande).
Entrer en ligne de commande ; vérifier la lettre du lecteur systeme (par exemple avec diskpart > list vol). Ici c’est D:. Puis lancer :

dism /capture-image /imagefile:D:\win10custom.wim /capturedir:d:\ /name:"Win10 Pro Custom Edition"

À la fin de l’opération, on a un fichier win10custom.wim, qui peut se substituer au fichier install.wim d’une install classique (en le renommant install.wim)

Si besoin, splitter l’image :
Dism /Split-Image /ImageFile:D:\win10custom.wim /SWMFile:D:\win10custom.swm /FileSize:3900

Problèmes

En cas message erreur après sysprep (cant complete installation) ; ce problème vient du fait que le compte Administrateur utilisé pour le mode audit a un mot de passe vide, ce qui est contraire aux exigences de sécurité. Pour le régler :
https://www.urtech.ca/2015/12/solved-windows-could-not-complete-the-installation-windows-10-sysprep/
Maj-F10 -> secpol.msc puis Accout policy -> Password policy -> longueur minimale 0
ou bien on peut changer le mot de passe du compte admin :
Maj-F10 -> net user Administrateur Password1234.
On peut par la suite supprimer ce mot de passe avec la commande
net user Administrateur * puis en validant 2 fois un mdp vide.

Si on a une erreur à la généralisation, on peut vérifier pourquoi dans le log C:\Windows\System32\Sysprep\Panther\setupact.log.
Si c’est une erreur du type Package 123123123.Blablabla_version_editor was installed for a user, but not provisionned for all users, il faut le supprimer. Pour ceci, on vérifie qu’il est trouvé :
get-appxpackage -alluser *Blablabla*
S’il est bien trouvé, on le supprime avec :
get-appxpackage -allusers *Blablabla* | remove-appxpackage -allusers

Il est possible que Windows retourne l’erreur “Windows n’a pas pu valider votre installation”. Vérifier l’état de Bitlocker avec manage-bde -status. Il faut désactiver bitlocker pour pouvoir généraliser l’image. pour ceci, sous Powershell : Disable-Bitlocker –MountPoint ‘C:'.
https://theitbros.com/sysprep-was-not-able-to-validate-your-windows-installation/

Sortir du mode Audit

Si on souhaite sortir du mode Audit, il faut entrer la commande sysprep et choisir “Enter OOBE”. On aura l’obligation de créer un nouvel utilisateur admin, mais les utilisateurs existants ne sont pas affectés. On peut ensuite se logger avec un ancien utilisateur et suprimer l’utilisateur nouvellement créé.

07 Jun 2021, 00:00

Envoi d'un mail d'avertissement lorsque le mot passe AD est proche de l'expiration

Préambule

Le but est d’avertir les utilisateurs d’un domaine Active Directory lorsque leur mot de passe est proche de l’expiration, pour leur permettre de le renouveler avant l’expiration.

Le renouvellemnt se fait sans problème lorsque l’on est connecté directement au réseau, mais dans le cas d’un accès via OpenVPN avec authentification auprès de l’AD, la connexion VPN sera bloquée lorsque le mot de passe est expiré. D’où la procédure ici-présente.

Stockage du mot de passe de manière chiffrée

Source

Le but, si je comprends bien, est d’enregistrer une empreinte du mot de passe (ou le mot de passe chiffré) dans un fichier, pour qu’il soit utilisable sans interaction humaine, sans pour autant être exposé en clair sur le disque.

Le fichier obtenu sera spécifique à ce compte utilisateur, et cette machine. Il devra être recréé si l’opération doit être effectuée depuis un autre compte, ou le même compte sur une autre machine.

Lancer powershell, puis les commandes suivantes (adapter le chemin de fichier si besoin) :

$credential = Get-Credential # entrer identifiant et mot de passe à conserver
$credential.Password | ConvertFrom-SecureString | Set-Content D:\encrypted_password.txt

Le fichier D:\encrypted_password.txt contient le hash qui nous intéresse.

À noter que ceci a été réalisé en utilisant un utilisateur qui possède une licence valide auprès d’Office 365. Non testé auprès d’autres fournisseurs SMTP.

Script pour générer et envoyer les mails

Il s’agit du script de Robert Pearman que j’ai légèrement modifié, et francisé.

Le script en question, qui doit être enregistré avec l’extension .ps1 (penser à modifier les variables de début de script) :

#################################################################################################################
#
# Version 1.4 February 2016
# Robert Pearman (WSSMB MVP)
# TitleRequired.com
# Script to Automated Email Reminders when Users Passwords due to Expire.
#
# Requires: Windows PowerShell Module for Active Directory
#
# For assistance and ideas, visit the TechNet Gallery Q&A Page. http://gallery.technet.microsoft.com/Password-Expiry-Email-177c3e27/view/Discussions#content
# Or Checkout my Youtube Channel - https://www.youtube.com/user/robtitlerequired
#
##################################################################################################################
# Please Configure the following variables....

$smtpServer="smtp.office365.com"
$expireindays = 14
$mailfrom = "expediteur@example.com"
$passwordFile = "D:\encrypted_password.txt"
$from = "Mot de passe <$mailfrom>"

$logging = "Enabled" # Set to Disabled to Disable Logging
$logFile = "C:\log_mail.csv" # ie. c:\mylog.csv

$testing = "Enabled" # Set to Disabled to Email Users
$testRecipient = "debug@example.com"

#
###################################################################################################################

# get password from file
$encryptedPassword = Get-Content $passwordFile | ConvertTo-SecureString
$Credential = New-Object System.Management.Automation.PsCredential($mailfrom, $encryptedPassword)

# Check Logging Settings
if (($logging) -eq "Enabled")
{
    # Test Log File Path
    $logfilePath = (Test-Path $logFile)
    if (($logFilePath) -ne "True")
    {
        # Create CSV File and Headers
        New-Item $logfile -ItemType File
        Add-Content $logfile "Date,Name,EmailAddress,DaystoExpire,ExpiresOn,Notified"
    }
} # End Logging Check

# System Settings
$textEncoding = [System.Text.Encoding]::UTF8
$date = Get-Date -format ddMMyyyy
# End System Settings

# Get Users From AD who are Enabled, Passwords Expire and are Not Currently Expired
Import-Module ActiveDirectory
$users = get-aduser -filter * -properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress |where {$_.Enabled -eq "True"} | where { $_.PasswordNeverExpires -eq $false } | where { $_.passwordexpired -eq $false }
$DefaultmaxPasswordAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge

# Process Each User for Password Expiry
foreach ($user in $users)
{
    $Name = $user.Name
    $emailaddress = $user.emailaddress
    $passwordSetDate = $user.PasswordLastSet
    $PasswordPol = (Get-AduserResultantPasswordPolicy $user)
    $sent = "" # Reset Sent Flag
    # Check for Fine Grained Password
    if (($PasswordPol) -ne $null)
    {
        $maxPasswordAge = ($PasswordPol).MaxPasswordAge
    }
    else
    {
        # No FGP set to Domain Default
        $maxPasswordAge = $DefaultmaxPasswordAge
    }


    $expireson = $passwordsetdate + $maxPasswordAge
    $today = (get-date)
    $daystoexpire = (New-TimeSpan -Start $today -End $Expireson).Days

    # Set Greeting based on Number of Days to Expiry.

    # Check Number of Days to Expiry
    $messageDays = $daystoexpire

    if (($messageDays) -gt "1")
    {
        $messageDays = "dans " + "$daystoexpire" + " jours."
    }
    else
    {
        $messageDays = "aujourd'hui."
    }

    # Email Subject Set Here
    $subject="Votre mot de passe ESCDA expire $messageDays"

    # Email Body Set Here, Note You can use HTML, including Images.
    $body ="
    $name,
    <p> Votre mot de passe va expirer $messageDays<br>
    Pour changer votre mot de passe, appuyer sur Ctrl+Alt+Suppr et choisir Modifier un mot de passe <br>
    <p>Merci, <br>
    </P>"


    # If Testing Is Enabled - Email Administrator
    if (($testing) -eq "Enabled")
    {
        $emailaddress = $testRecipient
    } # End Testing

    # If a user has no email address listed
    if (($emailaddress) -eq $null)
    {
        $emailaddress = $testRecipient
    }# End No Valid Email

    # Send Email Message
    if (($daystoexpire -ge "0") -and ($daystoexpire -lt $expireindays))
    {
        $sent = "Yes"
        # If Logging is Enabled Log Details
        if (($logging) -eq "Enabled")
        {
            Add-Content $logfile "$date,$Name,$emailaddress,$daystoExpire,$expireson,$sent"
        }
        # Send Email Message
        Send-Mailmessage -Credential $Credential -smtpServer $smtpServer -from $from -to $emailaddress -Port "587" -useSsl -subject $subject -body $body -bodyasHTML -priority High -Encoding $textEncoding

    } # End Send Message
    else # Log Non Expiring Password
    {
        $sent = "No"
        # If Logging is Enabled Log Details
        if (($logging) -eq "Enabled")
        {
            Add-Content $logfile "$date,$Name,$emailaddress,$daystoExpire,$expireson,$sent"
        }
    }

} # End User Processing


# End

Ce script va parcourir les utilisateurs et isoler chaque utilisateur dont le mot de passe :

  • possède une date d’expiration
  • n’est pas encore expiré

et pour chacun d’eux, envoie un mail à l’adresse mail spécifiée dans leur profil AD, ou à l’adresse “$testRecipient” si aucune adresse n’est spécifiée.
(Note : en l’état, le script est en mode de test, et n’écrit donc qu’à l’adresse $testRecipient. pour activer l’envoi réel des mails aux utilisateurs, il faut passer $testing à Disabled dans les variables de début de script)

On retrouve la liste des utilisateurs traités (que leur adresse expire bientôt ou non) dans le fichier de log, par défaut C:\log_mail.csv. Ceci peut se désactiver en passant $logging à Disabled.

Tâche planifiée

Enfin, il faut activer l’éxécution automatique de ce script. Pour ceci, dans taskschd.msc, créer une tâche de base, mettre en programme/script powershell et en argument -windowstyle hidden -File "C:\chemin\vers\le\script\password_notification.ps1"

09 Sep 2020, 00:00

Généralités sur les GPO

Généralités

La GPO est présente dans “Objets de Stratégies de groupe”. Elle n’y a aucun effet.

Elle doit être liée à un objet, qui peut être le Local system, un Domaine, un Site ou une OU (unité d’organisation).
Une fois liée, elle s’applique à cet objet, et tout ce qu’il contient.
On peut laisser le lien en place, mais le désactiver, via clic-droit sur le lien. ATTENTION, il s’agit de la notion de “Lien activé”, et non la notion d'“Appliquer” (qui est là pour forcer l’application de la GPO à la descendance).
Il est possible de désactiver les paramètres ordinateur et/ou utilisateurs d’une GPO.
Cela vaut le coup, après modification d’un GPO, d’attendre ~ une minute avant de faire gpupdate /force sur les clients, le temps qu’elle soit bien prise en compte et synchronisée sur les différents PDC.

Priorité et héritage

Les GPO sont appliquées dans l’ordre suivant, avec priorité à la dernière occurence :

  1. Local
  2. Site
  3. Domaine
  4. OU

Il est possible de bloquer l’héritage, ce qui bloque l’héritage reçu et non l’héritage légué.
On peut également “Appliquer” (Enforced) un lien vers une GPO. Ceci aura pour effet que cette GPO ne pourra pas être outrepassée par une GPO dans une OU descendant de celle-ci, et l’héritage sera forcé vers les descendants, même si ceux-ci le bloquent.

Groupes, OUs, Ordinateurs

La gestion des OUs et de leurs membres se fait dans Utilisateurs et Ordinateurs Active Directory. Les ordinateurs sont présents, en tant qu’objet Ordinateur, dans la catégorie Computers, mais également en tant que Groupe de sécurité “Ordinateurs du domaine” (donc dans la catégorie Users).
On peut sortir un ordinateur de la catégorie Computer, par exemple pour le mettre dans une OU, il restera par défaut dans le groupe “Ordinateurs du domaine”. Ceci permet de l’inclure quand même via les filtres de sécurité.

Lorsqu’on applique un filtre de sécurité, pour déterminer les (sous-)objets auxquels s’appliquer la GPO, ce sont des objets de type utilisateur, groupe, ordinateur, mais PAS des OU.
Les objets hors de ce filtre de sécurité n’ont, semble-t-il, pas le droit de lecture sur la GPO, donc impossibilité de l’appliquer.
Il me semble que cette mécanique empêche un compte hors du domaine (par exemple l’administrateur local d’un poste joint au domaine) d’appliquer quelque GPO que ce soit.

Lorsqu’une GPO est liée au domaine lui-même, elle concerne tous les objets du domaine, dont le groupe “Utilisateurs du domaine” et le groupe “Ordinateur du domaine”. Les paramètres utilisateurs et ordinateurs s’appliquent donc.
Toutefois, si on crée une OU SPECIAL_COMPUTER et une OU SPECIAL_USER, dans lesquelles on glisse respectivement un ordinateur, et un utilisateur, et que l’on lie une même GPO à ces 2 OUs, seuls les paramètres ordinateur s’appliqueront à la l’OU SPECIAL_COMPUTER et seuls les paramètres utilisateur s’appliqueront à l’OU SPECIAL_USER.

Il est possible de configurer un Loopback Processing Mode : on crée une GPO avec des règles utilisateurs, et on la lie à une unité contenant des ordinateurs. Avec l’activation du loopback, les stratégies utilisateurs s’appliquent aux utilisateurs loggés sur ces ordinateurs.
Pour ceci : modifier la GPO qui doit s’appliquer aux utilisateurs, et aller dans Config ordinateur / Stratégies / Modèles d'administration / Système / Stratégie de groupe et activer “Configurer le mode de traitement par bouclage de la stratégie de groupe utilisateur”.
La différence entre Remplacer et Fusionner est décrite dans le cadre de droite.
Si les Modèles d’administration sont absents, il faut les ajouter.

Diagnostic des GPO qui ne s’appliquent pas

  • La GPO est-elle liée à l’objet désiré ? Directement ou via héritage ?
  • Le lien est-il activé ?
  • Des paramètres utilisateurs et/ou ordinateurs sont-ils désactivés ?
  • Le filtrage de sécurité donne-t-il les autorisations de lecture à l’objet qui doit les appliquer ?
  • Est-elle outrepassée par une autre GPO avec une priorité plus élevée ?
  • Pour les installations de logiciel, ceci se produit avant l’ouverture de la session ; l’emplacement du fichier doit donc être accessible en lecture par le groupe “Ordinateurs du domaine”
  • Pour les déploiements d’imprimante, il faut généralement déco/reco la session

http://woshub.com/group-policy-not-applied-troubleshooting/

01 Dec 2019, 00:00

Réinitialiser la prise en compte du TPM par Windows

Suite à un changement de carte-mère, et donc à un remplacement de la puce TPM dedans, il peut arriver d’avoir des messages d’erreur (notamment 0x80090016) à l’ouverture de session Windows, ou Outlook (ou autre ?).

Ceci semble lié au fait que les infos d’identification étaient chiffrées grâce à un jeu de clés situé matériellement dans la puce TPM.
Pour corriger ceci, il faut renommer le dossier

C:\users\%username%\AppData\Local\Packages\Microsoft.AAD.BrokerPlugin_cw5n1h2txyewy

en .OLD (ou le supprimer…). Puis fermer la session.

Les infos d’identification seront redemandées au prochain lancement de la session ou de l’appli (et, je suppose, chiffrées grace au nouveau jeu de clés de la nouvelle puce).

Source

Il semble que dans certains cas (visiblement en lien avec la protection par code PIN), la solution soit plutôt (ou aussi ?) de supprimer le contenu du dossier

C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\