Question convertir  System.Int32

Plus d'informations
il y a 9 ans 3 mois #23030 par hays
convertir  System.Int32 a été créé par hays
Bonjour,

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.

Plus d'informations
il y a 9 ans 3 mois #23031 par xyz
Réponse de xyz sur le sujet Re:convertir  System.Int32
n3m0 écrit:

voici l'erreur qui est clair mais je sais pas comment contourner

Le mieux est de comprendre le pourquoi :-)
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.

Plus d'informations
il y a 9 ans 3 mois #23032 par hays
Réponse de hays sur le sujet Re:convertir  System.Int32
Merci pour votre réponse.

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.

Plus d'informations
il y a 9 ans 3 mois #23033 par hays
Réponse de hays sur le sujet Re:convertir  System.Int32
il y a rien dans $b

L'opération « [System.Int32] - [Microsoft.ActiveDirectory.Management.ADPropertyValueCollection] » n'est pas d
Au niveau de rapport.ps1 : 33 Caractère : 10
+ $c = $a - &lt;&lt;&lt;&lt; $b
+ CategoryInfo : InvalidOperation: (4:Int32) [], RuntimeException
+ FullyQualifiedErrorId : NotAdefinedOperationForTypeType


Voulez-vous continuer cette opération ?
34+ &lt;&lt;&lt;&lt; write-host $c \&quot;connecté depuis moins d'un mois\&quot;
[O] Oui [T] Oui pour tout [N] Non Non pour tout Suspendre [?] Aide (la valeur par défaut est « O
PS &gt;&gt; $a
4
PS &gt;&gt;&gt; $b
PS &gt;&gt;&gt; $c
0

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

Plus d'informations
il y a 9 ans 3 mois #23037 par hays
Réponse de hays sur le sujet Re:convertir  System.Int32
c'est bon j'ai reussi voici le code

import-module activedirectory
$collection = Get-ADOrganizationalUnit -Filter 'Name -like \&quot;*\&quot;'# | 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 \&quot;Nom\&quot; -MemberType Noteproperty -value $user.name
$ajout | Add-Member -Name \&quot;Logon\&quot; -MemberType Noteproperty -value $user.Lastlogondate
$ajout | Add-Member -Name \&quot;S.I.D\&quot; -MemberType Noteproperty -value $user.sid.value
$tableau += $ajout
}
write-host $tableau.count \&quot;utilisateur non connecté depuis plus de 1 mois \&quot;
$tableau
if ($inactifs.count -gt 0)
{
write-host $inactifs.count \&quot;comptes desactivé \&quot;
}
write-host $utilisateurs.count \&quot;utilisateurs au total\&quot;
#$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 \&quot;connecté depuis moins d'un mois\&quot;

write-host \&quot;######################################################################\&quot;
write-host \&quot;############################################################################################\&quot;


}


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.

Plus d'informations
il y a 9 ans 3 mois #23044 par xyz
Réponse de xyz sur le sujet Re:convertir  System.Int32
n3m0 écrit:

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.

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 magie :-)
n3m0 écrit:

il y a rien dans $b

Rien qui ne peut être affiché, pour le debug j'utilise qq chose comme ça : ($null -ne $b) and ($b.GetType() )
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:

j'ai l'impression de pas avoir été malin de faire du write-host

Avec PS il faut découpler le traitement de l'affichage des données du traitement: 1)Get-MesDonnées 2)Format-MesDonnées
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 \&quot;utilisateur ...\&quot;
$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.

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