Question
convertir System.Int32
- hays
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 41
- Remerciements reçus 0
j'ai mon chef qui me demande aujourd'hui de lui récupérer des info sur notre AD.
j'ai recupéré des infos ici et la et voici le script que j'ai pour l'instant qui est issue en grande parti d'un blog
[code:1]
import-module activedirectory
$collection = Get-ADOrganizationalUnit -Filter 'Name -like \"*\"'# | FT Name, DistinguishedName -A
foreach ($item in $collection)
{
write-host $item.Name
$OU = $item.Name
$utilisateurs = Get-ADUser -Filter * -SearchBase $item.DistinguishedName -Properties *
$actifs = $utilisateurs | Where-Object {$_.enabled -eq $true}
$inactifs = $utilisateurs | Where-Object {$_.enabled -eq $false}
$date = Get-Date
$connectes = $actifs | Where-Object {($_.lastlogondate -lt $date.AddMonths(-1)) -and ($_.lastlogondate -ne $null)}
$tableau = @()
foreach ($user in $connectes)
{
$ajout = New-Object Psobject
$ajout | Add-Member -Name \"Nom\" -MemberType Noteproperty -value $user.name
$ajout | Add-Member -Name \"Logon\" -MemberType Noteproperty -value $user.Lastlogondate
$ajout | Add-Member -Name \"S.I.D\" -MemberType Noteproperty -value $user.sid.value
$tableau += $ajout
}
write-host $tableau.count \"utilisateur non connecté depuis plus de 1 mois \"
$tableau
if ($inactifs.count -gt 0)
{
write-host $inactifs.count \"comptes desactivé \"
}
write-host $utilisateurs.count \"utilisateurs au total\"
#$utilisateurs_total = Get-ADUser -Filter * -SearchBase $item.DistinguishedName
$a = $utilisateurs.count
$b = $connectes.count
[int]$count1= $a
[int]$count1= $b
$c = $count1 - $count2
write-host $c \"connecté depuis moins d'un mois\"
write-host \"######################################################################\"
write-host \"############################################################################################\"
}
[/code:1]
c'est un début mais je dois lui rendre ça vite et j'ai une erreur un peu bizarre à cause de ces lignes .
[code:1]$a = $utilisateurs.count
$b = $connectes.count
$c = $a - $b
write-host $c \"connecté depuis moins d'un mois\"
[/code:1]
voici l'erreur qui est clair mais je sais pas comment contourner
[code:1]
L'opération « [System.Int32] - [Microsoft.ActiveDirectory.Management.ADPropertyValueCollection] » n'est pas définie.
Au niveau de C:\test.ps1 : 33 Caractère : 10
+ $c = $a - <<<< $b
+ CategoryInfo : InvalidOperation: (7:Int32) [], RuntimeException
+ FullyQualifiedErrorId : NotAdefinedOperationForTypeType
[/code:1]
est-ce qu'une âme charitable pourrais m'aiguiller
merci
Message édité par: n3m0, à: 1/02/17 11:12<br><br>Message édité par: n3m0, à: 1/02/17 11:17
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Le mieux est de comprendre le pourquoivoici l'erreur qui est clair mais je sais pas comment contourner
Tu as deux objets de type différent, le second semble être une collection. La soustraction n'est donc pas possible entre deux variables de type différent et incompatible.
Il te faut vérifier ou tracer avec write-debug où se trouve l'affectation de la variable du type ADPropertyValueCollection.
Et ici il y a comme un pb :
[code:1]
[int]$count1= $a
[int]$count1= $b
[/code:1]
Avec $count2 ce serait peut être plus mieux
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- hays
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 41
- Remerciements reçus 0
effectivement j'ai coller bêtement le code sur lequel je testé
j'ai bien vue que le problème était lié au type de la variable mais je croyais que le simple fait de mettre [int] permettrait de faire comprendre à l’interpréteur que ce n'est plus du texte mais un chiffre.
je suis embêté pour le debug car sur le serveur j'ai cette version de powershell
[code:1]PS $PSVersionTable
Name Value
----
CLRVersion 2.0.50727.4952
BuildVersion 6.1.7600.16385
PSVersion 2.0
WSManStackVersion 2.0
PSCompatibleVersions {1.0, 2.0}
SerializationVersion 1.1.0.1
PSRemotingProtocolVersion 2.1[/code:1]
je continu a tenter dans la console mais pas de ISE c'est plus difficile a manipuler
Connexion ou Créer un compte pour participer à la conversation.
- hays
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 41
- Remerciements reçus 0
L'opération « [System.Int32] - [Microsoft.ActiveDirectory.Management.ADPropertyValueCollection] » n'est pas d
Au niveau de rapport.ps1 : 33 Caractère : 10
+ $c = $a - <<<< $b
+ CategoryInfo : InvalidOperation: (4:Int32) [], RuntimeException
+ FullyQualifiedErrorId : NotAdefinedOperationForTypeType
Voulez-vous continuer cette opération ?
34+ <<<< write-host $c \"connecté depuis moins d'un mois\"
[O] Oui [T] Oui pour tout [N] Non Non pour toutSuspendre [?] Aide (la valeur par défaut est « O
PS >> $a
4
PS >>> $b
PS >>> $c
0
Connexion ou Créer un compte pour participer à la conversation.
- hays
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 41
- Remerciements reçus 0
import-module activedirectory
$collection = Get-ADOrganizationalUnit -Filter 'Name -like \"*\"'# | FT Name, DistinguishedName -A
foreach ($item in $collection)
{
write-host $item.Name
$OU = $item.Name
$utilisateurs = Get-ADUser -Filter * -SearchBase $item.DistinguishedName -Properties *
$actifs = $utilisateurs | Where-Object {$_.enabled -eq $true}
$inactifs = $utilisateurs | Where-Object {$_.enabled -eq $false}
$date = Get-Date
$connectes = $actifs | Where-Object {($_.lastlogondate -lt $date.AddMonths(-1)) -and ($_.lastlogondate -ne $null)}
$tableau = @()
foreach ($user in $connectes)
{
$ajout = New-Object Psobject
$ajout | Add-Member -Name \"Nom\" -MemberType Noteproperty -value $user.name
$ajout | Add-Member -Name \"Logon\" -MemberType Noteproperty -value $user.Lastlogondate
$ajout | Add-Member -Name \"S.I.D\" -MemberType Noteproperty -value $user.sid.value
$tableau += $ajout
}
write-host $tableau.count \"utilisateur non connecté depuis plus de 1 mois \"
$tableau
if ($inactifs.count -gt 0)
{
write-host $inactifs.count \"comptes desactivé \"
}
write-host $utilisateurs.count \"utilisateurs au total\"
#$utilisateurs_total = Get-ADUser -Filter * -SearchBase $item.DistinguishedName
if (!$utilisateurs.count)
{
[int]$a = 0
}
else
{
$a = $utilisateurs.count
}
if (!$connectes.count)
{
[int]$b = 0
}
else {[int]$b =$connectes.count}
$c = $a - $b
write-host $c \"connecté depuis moins d'un mois\"
write-host \"######################################################################\"
write-host \"############################################################################################\"
}
maintenant je réfléchi à la mise en forme j'ai l'impression de pas avoir été malin de faire du write-host
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
C'est une tentative de cast (transtypage). On ne transforme pas ce qui ne peut l'être, sinon dans ce cas on fait de la magieje croyais que le simple fait de mettre [int] permettrait de faire comprendre à l’interpréteur que ce n'est plus du texte mais un chiffre.
n3m0 écrit:
Rien qui ne peut être affiché, pour le debug j'utilise qq chose comme ça : ($null -ne $b) and ($b.GetType() )il y a rien dans $b
Sur + lignes c'est préférable , c'est + 'long' à écrire, mais plus lisible et rapide à débugger.
Des variables d'un certains type n'affichent rien dans la console, pour les collections/les génériques l'usage de la virgule peut afficher le contenu : ,$b
n3m0 écrit:
Avec PS il faut découpler le traitement de l'affichage des données du traitement: 1)Get-MesDonnées 2)Format-MesDonnéesj'ai l'impression de pas avoir été malin de faire du write-host
Au final : Get-MesDonnées | Format-MesDonnées
De cette manière tu peux changer le format ou exporter dans csv, un pdf, un docx, ...
ps
En relisant ton dernier code on peut le simplifier mais je n'ai pas d'AD à dispos pour tester.
Et ceci est à proscrire :
[code:1]
write-host $tableau.count \"utilisateur ...\"
$tableau
[/code:1]
Car tu émets des données dans le pipeline, en cas d'adaptation/refontes ou d'enchaînement de scripts, tu risques d'avoir des effets de bord pénibles à débugger
Message édité par: Laurent Dardenne, à: 1/02/17 22:25
Erreur dans le code<br><br>Message édité par: Laurent Dardenne, à: 2/02/17 11:24
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- convertir System.Int32