Catégorie : Windows

[Powershell] Récupérer la date de dernière connexion

#
# 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 !"
}

[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é.

(suite…)

[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.

(suite…)

[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)