#
# Get-Lastlogon
#
# Auteur : Johan
# Contact : johan@slashroot.fr
# Date : 24/03/14
# Version : 1.0
# Description : Récupère la date de dernière connexion d'un utilisateur ou d'un ordinateur
# Commentaire : Le lastlogon n'etant pas replique entre les DCs, le script recupere les valeurs de chaque DC puis selectionne la plus recente
# Requis : Module ActiveDirectory
# On importe le module ActiveDirectory
Import-Module ActiveDirectory -ErrorAction SilentlyContinue
# Si le module est bien présent
if ($? -eq 'true')
{
# On lance la boucle pour chaque demande (utilisateur/ordinateur)
do {
# On lance la boucle pour la séléction du type (utilisateur ou ordinateur) afin de prendre en compte les fautes de frappe
$i=0
while ($i -eq 0)
{
# Mise en forme de l'affichage
echo "`nAfficher la date de derniere connexion d'un :`n"
echo "1 - Utilisateur"
echo "2 - Ordinateur`n"
# Demande du type
$choix = Read-host "Choix"
echo ""
# Demande du login utilisateur ou nom de machine puis test de l'existence du compte
# Si l'utilisateur existe, on continue le script, sinon, on recommence le script
switch ($choix){
1 {$name = Read-host "Login de l'utilisateur "; echo "" ; if ((Get-ADUser -Filter {sAMAccountName -eq $name}) -ne $null) { $i=1 } else { echo "L'utilisateur n'existe pas !`n" }; break}
2 {$name = Read-host "Nom de la machine "; echo "" ; if ((Get-ADComputer -Filter {name -eq $name}) -ne $null) { $i=1 } else { echo "L'ordinateur n'existe pas !`n" }; break}
default {"Mauvais choix !`n"; break}
}
}
# On récupère la liste de tous les DC du domaine
$liste_DC = (Get-ADDomainController -Filter *).HostName
# On fixe les variables
$lastLogon = 0
$logonDC = $null
# Pour chaque DC du domaine
foreach ($dc in $liste_DC)
{
# On formule la requête selon le type et on récupère la valeur
switch ($choix){
1 {$res = Get-ADUser $name -Properties LastLogon -Server $dc ; break}
2 {$res = Get-ADComputer $name -Properties LastLogon -Server $dc ; break}
}
# Si le lastlogon est plus récent, on prend la valeur et le nom du DC
if ($lastLogon -lt $res.LastLogon)
{
$lastLogon = $res.LastLogon
$logonDc = $dc
}
}
# On converti le lastlogon au format date
$lastLogon = [DateTime]::FromFileTime($lastLogon)
# On affichage le lastlogon et le DC correspondant
echo "Derniere connexion : $lastlogon"
echo "Serveur : $logonDC`n"
# On propose de relancer le script pour un autre compte
$quit = Read-Host “On continue ? (O/n)”
}
until (($quit -eq “n”) -or ($quit -eq “N”))
}
else
{
# Si le module est absent, on abandonne le script
echo "Il faut le module ActiveDirectory !"
}
Catégorie : Windows
[Powershell] Lister les postes inactifs
#
# Get-Inactive-Computers
#
# Auteur : Johan
# Contact : johan@slashroot.fr
# Date : 03/12/15
# Version : 1.0
# Description : Ce script récupère tous les postes présents dans la l'AD et dresse la liste des postes ne s'étants pas connectés depuis X mois
# Commentaire : Le résultat est envoyé par email
# Requis : Module ActiveDirectory
#
# Variables
#
# Base de recherche
$base="OU=postes,DC=slashroot,DC=fr"
# Seuil d'inactivité (en mois)
$seuil="6"
# Parametres de messagerie
$expediteur = "bob@slashroot.fr"
$destinataire = "admin@slashroot.fr"
$serveur = "mx.slashroot.fr"
# On filtre le résultat selon l'OS (on ne prend pas en compte les Linux)
$os_filter="W*"
# Date d'il y a X mois
$date_seuil=$(Get-Date).addMonths(-$seuil)
$resultat=""
#
# Au boulot
#
# On importe le module ActiveDirectory
Import-Module ActiveDirectory -ErrorAction SilentlyContinue
# Si le module est bien présent
if ($? -eq 'true')
{
# Requête LDAP pour récupérer tous les postes Windows
$strCategory = “computer”
$objDomain = New-Object System.DirectoryServices.DirectoryEntry(“LDAP://$base”)
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher($objDomain,”(&(objectCategory=$strCategory)(operatingSystem=$os_filter))”,@(‘name’))
$liste=$objSearcher.FindAll() | %{$_.properties.name} | sort
# Liste de tous les DC du domaine
$liste_DC = (Get-ADDomainController -Filter *).HostName
# Pour chaque poste on récupère son lastlogon sur chaque DC afin de trouver le plus récent
foreach ($poste in $liste)
{
# On fixe les variables
$lastLogon = 0
$logonDC = $null
# Pour chaque DC du domaine
foreach ($dc in $liste_DC)
{
$res = Get-ADComputer $poste -Properties LastLogon -Server $dc
# Si le lastlogon est plus récent, on prend la valeur et le nom du DC
if ($lastLogon -lt $res.LastLogon)
{
$lastLogon = $res.LastLogon
$logonDc = $dc
}
}
# On converti le lastlogon au format date
$lastLogon = [DateTime]::FromFileTime($lastLogon)
# Si le lastlogon est plus vieux que le seuil fixé, on ajoute le poste à la liste (en ne gardant que la date JJ/MM/YYYY)
if ($lastLogon -lt $date_seuil)
{
$resultat+="$poste - $lastLogon `r"
}
}
# Si on a des postes problematiques
if ( $resultat -ne "" )
{
# On envoi le résultant par email
$objet = "[Active Directory] Postes inactifs"
$texte = "Bonjour,`r`rVoici la liste des postes ne s'étant pas connectés au domaine depuis plus de $seuil mois :`r`r$resultat`rCordialement`r--`rBob"
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
$SMTPclient = new-object System.Net.Mail.SmtpClient $serveur
$SMTPclient.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
$SMTPclient.Send($message)
}
}
else
{
# Si le module est absent, on abandonne le script
echo "Il faut le module ActiveDirectory !"
}
[Active Directory] Déployer des imprimantes par GPO
Nous supposons un serveur d’impression en 2008 R2 avec des clients Seven.
Création de la GPO :
Se rendre dans « Configuration utilisateur » -> « Préférences » -> « Paramètres du Panneau de configuration » -> « Imprimantes » :
Effectuer un clic droit « Nouveau » -> « Imprimante partagée »
Choisir mettre à jour (permet d’installer l’imprimante quand elle n’est pas présente et modifie sa configuration si un changement au niveau du serveur d’impression est effectuée).
Cocher le ciblage au niveau de l’élément puis dans l’éditeur de cible, cliquer sur « Nouvel élément » puis choisir la condition de déploiement (dans mon cas, l’appartenance de l’utilisateur à un groupe global). Il est possible de spécifier plusieurs conditions avec les opérateurs logiques ET et OU.
L’imprimante est maintenant configurée. Il ne reste plus qu’à faire de même pour les autres imprimantes.
Le ciblage le plus efficace dépend bien entendu de votre infrastructure. Avec le nombre impressionnant de critères de ciblage disponible, je pense que tout est facilement réalisable.
[Active Directory] Rôles FSMO
Dans un environnement de domaine Windows Server, les contrôleurs de domaine contiennent une réplique de la base de données Active Directory. Ce système de réplication est dit multi maitre car chaque contrôleur de domaine a la possibilité de modifier cette base de données et de transmettre ces modifications aux autres contrôleurs de domaine afin que tous possèdent la même base de données Active Directory.
Bien que Microsoft ait implémenté dans ses systèmes un certain nombre de règles pour éviter les conflits de réplication dans Active Directory, certaines mises à jour sont trop importantes pour être résolues avec ces règles, comme par exemple la modification du schéma Active Directory. C’est pourquoi Microsoft a créé depuis Windows 2000 Server les Flexible Single Master Operation (FSMO). Ce sont en fait des rôles attribués à différent serveurs de manière à ce que seuls certains serveurs permettent de modifier des aspects internes à Active Directory.
Il existe donc depuis Windows 2000 cinq rôles FSMO. Ces 5 rôles sont nécessaires au bon fonctionnement des différents domaines et forêts de l’infrastructure. Chacun de ces rôles ne peut être hébergé que par des contrôleurs de domaine et non par des serveurs membres. Ils ont également des étendues différentes et des domaines de réplication différents.
On distingue parmi les 5 rôles:
- Maître d’attribution de noms de domaines
- Contrôleur de schéma
- Maitre RID
- Maitre d’infrastructure
- Emulateur PDC
Le Maitre d’attribution de noms de domaines et le contrôleur de schéma ont une portée au niveau de la forêt, pour laquelle ils sont uniques.
Le maitre RID, le maitre d’infrastructure et l’émulateur PDC ont une portée au niveau du domaine, pour lequel ils sont uniques.
Nous allons présenter plus en détail les différents rôles ainsi que l’impact de leur indisponibilité.
[Active Directory] Mémo sur la méthode AGDLP
La méthode AGDLP (Account, Global group, Domain Local group, Permission) est la méthode recommandée par Microsoft pour gérer l’accès aux fichiers partagés en fonctions des différents groupes AD.
Le principe est le suivant :
- Les utilisateurs sont affectés à un groupe global
- Les groupes globaux sont ajoutés aux groupes locaux
- Les groupes locaux se voient attribués des permissions au niveau des ressources partagées
Les groupes globaux regroupent donc des utilisateurs qui se voient accorder des droits via des groupes locaux sur des ressources partagées.
En plus de la méthode AGDLP, comme vu dans le schéma précédant, chaque ressource sera liée à trois groupes locaux, chacun disposant de droits spécifiques :
- Contrôle total (CT)
- Lecture / Ecrite (RW)
- Lecture (RO)
Cela permet ainsi d’affecter à des groupes d’utilisateurs des droits spécifiques pour une même ressource. Dans l’exemple du schéma AGDLP, les utilisateurs du service Etudes d’Orsay se voient affecter des droits en lecture/écriture sur le dossier « Projet MIR».
Nous pouvons imaginer que les collaborateurs du service Production d’Orsay aient besoin de visualiser le contenu du dossier « Projet MIR ». Avec cette méthode il suffira alors d’ajouter le groupe global « G_ORS_Production » contenant les utilisateurs du service Production d’Orsay au groupe local « L_ProjetMIR_RO » permettant l’accès au dossier « ProjetMIR » en lecture seule.
Dans le cas où des personnes n’appartenant pas au même service auraient besoin d’accéder à une ressource spécifique il faudra alors créer un groupe global spécifique. Par exemple si chaque chef de service doit pouvoir accéder en lecture au dossier relatif à la comptabilité il faudra alors créer le groupe global « G_ORS_Direction » associé au groupe local « L_Comptabilite_RO ».
[Active Directory] Supprimer un contrôleur de domaine HS
Lorsqu’un DC devient HS, il est toujours présent dans l’architecture Active Directory tant qu’il n’a pas été « dépromu » ou supprimé.
Il faut alors utiliser NTDSUTIL pour le supprimer :
C:\Documents and Settings\Administrateur>ntdsutil ntdsutil: metadata cleanup metadata cleanup: connections server connections: connect to server MonDCQuiFonctionne Liaison à MonDCQuiFonctionne... Connecté à MonDCQuiFonctionne en utilisant les informations d'identification d'un utilisateur connecté localement. server connections: quit metadata cleanup: select operation target select operation target: list domains 1 domaine(s) trouvé(s) 0 - DC=em-corporation,DC=fr select operation target: select domain 0 Aucun site actuellement Domaine - DC=em-corporation,DC=fr Aucun serveur actuellement Pas de contexte de nommage en cours select operation target: list sites 1 site(s) trouvé(s) 0 - CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr select operation target: select site 0 Site - CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr Domaine - DC=em-corporation,DC=fr Aucun serveur actuellement Pas de contexte de nommage en cours select operation target: list servers in site 3 serveur(s) trouvé(s) 0 - CN=MonDCQuiFonctionne,CN=Servers,CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr 1 - CN=Un2emeDCFonctionnel,CN=Servers,CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr 2 - CN=MonDC-HS,CN=Servers,CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr select operation target: select server 2 Site - CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr Domaine - DC=em-corporation,DC=fr Serveur - CN=MonDC-HS,CN=Servers,CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr Objet DSA - CN=NTDS Settings,CN=MonDC-HS,CN=Servers,CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr Nom d'hôte DNS - MonDC-HS.em-corporation.fr Objet Ordinateur - CN=MonDC-HS,OU=Domain Controllers,DC=em-corporation,DC=fr Pas de contexte de nommage en cours select operation target: quit metadata cleanup: remove selected server Transfert ou prise des rôles FSMO depuis le serveur sélectionné. Suppression des métadonnées FRS du serveur sélectionné Recherche des membres FRS sous "CN=MonDC-HS,OU=Domain Controllers,DC=em-corporation,DC=fr". Suppression du membre FRS "CN=MonDC-HS,CN=Domain System Volume (SYSVOL share),CN=File Replication Service,CN=System,DC=em-corporation,DC=fr". Suppression de l'arborescence sous "CN=MonDC-HS,CN=Domain System Volume (SYSVOL share),CN=File Replication Service,CN=System,DC=em-corporation,DC=fr". Suppression de l'arborescence sous "CN=MonDC-HS,OU=Domain Controllers,DC=em-corporation,DC=fr". La tentative de suppression des paramètres FRS sur CN=MonDC-HS,CN=Servers,CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr a échoué. Raison : "Élément introuvable.". Le nettoyage des métadonnées continue. "CN=MonDC-HS,CN=Servers,CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr" supprimé du serveur "MonDCQuiFonctionne" metadata cleanup: quit ntdsutil: quit Déconnexion de MonDCQuiFonctionne...
Une fois ceci fait il ne reste plus qu’à supprimer le serveur au niveau de la console « Sites et services Active Directory » et de supprimer ses enregistrements DNS.
[Active Directory] Saisir des rôles FSMO
Lorsqu’un DC hébergeant des rôles FSMO devient HS, la seule solution concernant les rôles FSMO est de les saisir (seize en anglais) car le transfert est impossible.
Il faut alors utiliser NTDSUTIL pour se connecter au serveur qui va recevoir les rôles FSMO (avec le compte administrateur, nécessaire pour récupérer le rôle schéma master) :
C:\Documents and Settings\Administrateur>ntdsutil ntdsutil: roles fsmo maintenance: connections server connections: connect to server MonDCQuiFonctionne Liaison à MonDCQuiFonctionne... Connecté à MonDCQuiFonctionne en utilisant les informations d'identification d'un utilisateur connecté localement. server connections: q
Une fois en « fsmo maintenance » il suffit de saisir les rôles un par un :
fsmo maintenance: Seize infrastructure master Tentative de transfert sûr de infrastructure FSMO avant la cessation. Erreur ldap_modify_sW 0x34(52 (Non disponible). Le message d'erreur étendue Ldap est 000020AF: SvcErr: DSID-03210333, problem 5002 (UNAVAILABLE), data 1722 L'erreur Win32 renvoyée est 0x20af(L'opération FSMO demandée a échoué. Le propriétaire FMSO actuel n'a pas pu être contacté.) ) Selon le code d'erreur, ceci peut indiquer une erreur Ldap, de connexion ou de transfert de rôle. Le transfert de infrastructure FSMO a échoué, cessation en cours... Le serveur « MonDCQuiFonctionne » est informé de 5 rôles Schéma - CN=NTDS Settings,CN=MonDC-HS,CN=Servers,CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr Maître d'attribution de noms - CN=NTDS Settings,CN=MonDC-HS,CN=Servers,CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr PDC - CN=NTDS Settings,CN=MonDC-HS,CN=Servers,CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr RID - CN=NTDS Settings,CN=MonDC-HS,CN=Servers,CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr Infrastructure - CN=NTDS Settings,CN=MonDCQuiFonctionne,CN=Servers,CN=Premier-Site-par-defaut,CN=Sites,CN=Configuration,DC=em-corporation,DC=fr fsmo maintenance: Seize naming master [...] fsmo maintenance: Seize PDC [...] fsmo maintenance: Seize RID master [...] fsmo maintenance: Seize schema master [...]
Une fois les cinq rôles récupérer il suffit de quitter :
fsmo maintenance: quit
Le serveur spécifié lors de la connexion dispose maintenant des rôles FSMO saisis.
[Active Directory] Ajout de stations de travail au domaine
Par défaut tous les utilisateurs du domaine (groupe utilisateurs authentifiés) ont la possibilité d’intégrer 10 ordinateurs au domaine.
Pour mettre en place une politique plus restrictive il existe deux méthodes :
Restreindre le droit d’ajout
La configuration s’effectue sur la GPO de base des DC (Default Domain Controllers Policy) dans le menu :
Configuration ordinateur -> Stratégies -> Paramètres Windows -> Paramètres de sécurité -> Stratégies locales -> Attribution des droits utilisateurs -> Ajouter des stations de travail au domaine
Il suffit alors de choisir les groupes qui auront le droit d’intégrer des stations de travail au domaine:
Limiter le nombre d’ajouts
La configuration s’effectue via la console ADSI, dans les propriétés de la racine (via un clic droit) :
Il suffit alors de modifier la valeur de l’attribut « ms-DS-MachineAccountQuota » (le mettre à 0 si l’on ne souhaite pas que les utilisateurs puisse intégrer des postes de travail).
[Powershell] Liste des utilisateurs ne s’étant pas connectés au domaine depuis plus de 30 jours
# Nom : Comptes_inactifs.ps1
# Date : 17/02/2012
# Auteur : Johan
# Description : Liste les utilisateurs qui ne se sont pas connectés au domaine depuis
# plus de 30 jours et envoi le résultat par mail
# Commentaire : Exécution tous les 1er du mois
# Recherche dans l'OU souhaité tous les comptes utilisateurs
$ldapquery = [ADSI] 'LDAP://OU=Utilisateurs,DC=em-corporation,DC=fr'
$objrechercher = New-object system.directoryservices.directorysearcher($ldapQuery)
$objrechercher.filter ='(&(objectClass=person)(objectCategory=person))'
$boucle = $objrechercher.findall()
$liste=""
# Fonction Get-UTCAge permettant de transformer la valeur du lastlogon en date afin de calculer le nombre de jours depuis la dernière connexion
Function Get-UTCAge {
Param([int64]$Last=0)
if ($Last -eq 0) {
}
else
{
[datetime]$utc="1/1/1601"
$i=$Last/864000000000
$lastlogon = ($utc.adddays($i))
$today=get-date
$diff=($today)-($lastlogon)
# Si l'utilisateur ne s'est pas connecté depuis au moins 30 jours on ajoute son nom à la liste
if ($diff.Days -gt 30)
{
write "$name`r"
}
}
}
# Pour chaque utilisateur
foreach ($user in $boucle)
{
# On vérifie qu'il possède une adresse email (permettant de différencier les comptes utilisateurs des comptes génériques ou applicatifs)
if ($user.properties.mail)
{
# On récupère le nom et le lastlogon de l'utilisateur
$name = $user.properties.name
$last = $user.Properties.lastlogon
$liste+=Get-UTCAge $user.properties.item("lastlogon")[0]
}
}
# On prépare et on envoi le mail
$expediteur = "bob@em-corporation.fr"
$destinataire = " admin@em-corporation.fr"
$serveur = "@MTA"
$objet = "Active Directory - Utilisateurs inactifs"
$texte = "Bonjour,`r`rVoici la liste des utilisateurs ne s'étant pas connectés au domaine depuis plus de 30 jours :`r`r$liste`rCordialement`r--`rBob"
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
$SMTPclient = new-object System.Net.Mail.SmtpClient $serveur
$SMTPclient.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
$SMTPclient.Send($message)
[PsExec] Déployer un exécutable depuis un partage réseau
Installation d’un package depuis un dossier partagé sur un PC distant :
psexec -d -s \\PC_Cible \\PC_Partage\Setup.exe /q
-d permet de ne pas attendre que l’application se termine (à utiliser uniquement pour les applications non interactives)
-s permet d’exécuter le processus dans le compte System







