Question Problème de Filtre sur Objet

Plus d'informations
il y a 13 ans 6 mois #12618 par Fournier
Bonjour,

Nouveau sur PowerShell et sur ce forum (qui m'a déjà permis d'écrire ce script !), je suis bloqué sur un \"simple\" filtre.

Mon objectif : Extraire l'ensemble des comptes de l'AD et afficher ceux pour lesquelles la date d'expiration est dépassée ou le sera dans les 48 heures.

Voici mon script :

clear
$ExpringIn = (Get-Date).AddDays(2)

[datetime]$date = '01/01/1601'

$adsPath = 'LDAP://OU=01 - Comptes du Groupe, ' + ([ADSI]'').distinguishedName
$objDomaine = [ADSI]$adsPath
$objRecherche = New-Object `
System.DirectoryServices.DirectorySearcher ($objDomaine)
$requete = '(&(objectCategory=person) (objectClass=user))'
$objRecherche.Filter=$requete
$comptes = $objRecherche.FindAll()

$comptes |
select-object @{e={$_.properties.cn};n='Utilisateur'},
@{e={$_.properties.whencreated};n='Date de création'},
@{e={$date.AddTicks($($_.properties.lastlogontimestamp))};n='Dernière connexion'},
@{e={$date.AddTicks($($_.properties.pwdlastset)).AddDays(30)};n='Date expiration'} |
Where-Object {$date.AddTicks($($_.properties.pwdlastset)).AddDays(30) -gt $date} |
Where-Object {$date.AddTicks($($_.properties.pwdlastset)).AddDays(30) -lt $ExpringIn} |
Sort-Object 'Date expiration' |
Out-GridView


Les plus avisés :laugh: auront compris que le résultat du script est le suivant :

Utilisateur Date de création Dernière connexion Date expiration
TOTO un 01/01/2012 00:00:00 02/01/2012 00:00:00 31/01/1601 00:00:00
TOTO Deux 01/01/2012 00:00:00 20/02/2012 00:00:00 31/01/1601 00:00:00
TOTO Quatre 01/01/2012 00:00:00 06/04/2012 00:00:00 31/12/1999 00:00:00
TITI un 01/01/2012 00:00:00 07/08/2012 00:00:00 01/01/2011 00:00:00
TITI Quatre 01/01/2012 00:00:00 08/08/2012 00:00:00 10/01/2012 00:00:00
TITI Deux 01/01/2012 00:00:00 08/08/2012 00:00:00 20/10/2012 00:00:00

Celui-ci fonctionne très bien sauf pour les filtres (qui ne servent à rien puisque j'ai toutes les dates d'expiration).

Mon pb vient de toute évidence de ces 2 méchantes lignes :

Where-Object {$date.AddTicks($($_.properties.pwdlastset)).AddDays(30) -gt $date} |
Where-Object {$date.AddTicks($($_.properties.pwdlastset)).AddDays(30) -lt $ExpringIn} |

Quelqu'un aurait une idée ?

Merci.

PS. : Pardon pour la mise en forme, je suis nouveau sur les forums et suis incapable d'utiliser les 'BoardCode'.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 6 mois #12624 par Laurent Dardenne
Aleator écrit:

PS. : Pardon pour la mise en forme, je suis nouveau sur les forums et suis incapable d'utiliser les 'BoardCode'.

Editer le message, puis insérer

[ code ]

au début du code et

[/ code ]

en fin de code.
Ces noms de balises ne contenant pas d'espace, il faut les supprimer.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 6 mois #12644 par Fournier
Hello,

Voici le code finalisé (et dont je ne suis pas fier tellement il est mal écrit :( ) qui pourra peut-être servir à quelqu'un (au moins comme truc à ne pas faire) :

clear

$ExpringIn = (Get-Date).AddDays(31)

[datetime]$date = '01/01/1601'

$adsPath = 'LDAP://OU=01 - Comptes du Groupe 1, ' + ([ADSI]'').distinguishedName
$objDomaine = [ADSI]$adsPath
$objRecherche = New-Object `
System.DirectoryServices.DirectorySearcher ($objDomaine)
$requete = '(&(objectCategory=person) (objectClass=user))'
$objRecherche.Filter=$requete
$comptes = $objRecherche.FindAll()

$comptes |
select-object @{e={$_.properties.cn};n='Utilisateur'},
@{e={$_.properties.whencreated};n='Datecreation'},
@{e={$date.AddTicks($($_.properties.lastlogontimestamp))};n='Derniereconnexion'},
@{e={$date.AddTicks($($_.properties.pwdlastset)).AddDays(30)};n='Dateexpiration'} |

Export-Csv -path \"\\groupe\expiration1.csv\" -force -NoTypeInformation -encoding unicode


clear
$ExpringIn = (Get-Date).AddDays(2)

[datetime]$date = '01/01/1601'

$adsPath = 'LDAP://OU=Groupe 2, ' + ([ADSI]'').distinguishedName
$objDomaine = [ADSI]$adsPath
$objRecherche = New-Object `
System.DirectoryServices.DirectorySearcher ($objDomaine)
$requete = '(&(objectCategory=person) (objectClass=user))'
$objRecherche.Filter=$requete
$comptes = $objRecherche.FindAll()

$comptes |
select-object @{e={$_.properties.cn};n='Utilisateur'},
@{e={$_.properties.whencreated};n='Datedecreation'},
@{e={$date.AddTicks($($_.properties.lastlogontimestamp))};n='Derniereconnexion'},
@{e={$date.AddTicks($($_.properties.pwdlastset)).AddDays(30)};n='Dateexpiration'} |

Export-Csv -path \"\\groupe\expiration2.csv\" -force -NoTypeInformation -encoding unicode


clear
$ExpringIn = (Get-Date).AddDays(2)

[datetime]$date = '01/01/1601'

$adsPath = 'LDAP://OU=Groupe 3, ' + ([ADSI]'').distinguishedName
$objDomaine = [ADSI]$adsPath
$objRecherche = New-Object `
System.DirectoryServices.DirectorySearcher ($objDomaine)
$requete = '(&(objectCategory=person) (objectClass=user))'
$objRecherche.Filter=$requete
$comptes = $objRecherche.FindAll()

$comptes |
select-object @{e={$_.properties.cn};n='Utilisateur'},
@{e={$_.properties.whencreated};n='Datecreation'},
@{e={$date.AddTicks($($_.properties.lastlogontimestamp))};n='Derniereconnexion'},
@{e={$date.AddTicks($($_.properties.pwdlastset)).AddDays(30)};n='Dateexpiration'} |


Export-Csv -path \"\\groupe\expiration3.csv\" -force -NoTypeInformation -encoding unicode


get-childitem \"\\groupe\*.*\" -include \"expiration?.csv\" |
Import-Csv |
sort {$_.\"dateexpiration\" -as [datetime]} |
Export-Csv -path \"\\groupe\expiration.csv\" -force -NoTypeInformation -encoding unicode

get-childitem \"\\groupe\*.*\" -include \"expiration?.csv\" | remove-item

J'obtiens 1 seul fichier avec mes expirations pour les 3 OU.

Toute critique est la bienvenue (ne frapper pas trop fort).

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 6 mois #12646 par SiSMik
Réponse de SiSMik sur le sujet Re:Problème de Filtre sur Objet
Laurent Dardenne écrit:

Aleator écrit:

PS. : Pardon pour la mise en forme, je suis nouveau sur les forums et suis incapable d'utiliser les 'BoardCode'.

Editer le message, puis insérer

[ code ]

au début du code et

[/ code ]

en fin de code.
Ces noms de balises ne contenant pas d'espace, il faut les supprimer.


Merci de lire les messages qu'on puisse y voir quelque chose :)

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.048 secondes
Propulsé par Kunena