Question Fonction et traitement via fichier ou ad

Plus d'informations
il y a 2 ans 4 mois #31570 par Plarox
bonjour à tous je vient vers vous car malgrés mes heures passer devant mon script je ne trouve pas de solution

a la base on ma demander de faire un script qui interroge l'AD pour savoir quelle machine est admin local du pc
mon script fait le taf et sort 3 fichiers  -1 fichier (csv) des ordinateurs etant admin local
                                                           - 1 fichier (csv) des ordinateurs non testés car déconnecté
                                                           - 1 fichier (rtf) pour les logs
voila ou j'ai besoins de votre aide
============================ 1 er point==========================
on me demande que mon script prennent en compte le fichier csv des machines non testé du passage precedant
en gros si un fichier csv existe alors on charge ses valeur et on lance le teste
si il n'y as pas de fichier csv alors on cherche dans l'AD
tous ca en utilisant 2 fonctions
$n=0
 $v=0
 $w=0

 $strFilePathResut = $PSCommand.Basename + ".csv"
 $log = "c:\temp\logAdminLocal.rtf"
 $strFilePathNotConnected = "C:\temp\NotestAdminLocal.csv"
 $arrayComputersName = Import-CSV -path "C:\temp\NontestAdminLocal.csv"  -Encoding UTF8

Function Get-ComputersFromFile {
[cmdletbinding()]
Param (
[string]$strFilePath
)
# End of Parameters
 Process {
 
 }
 }


Function Get-ComputersFromAD {
[cmdletbinding()]
Param (
[string]$LDAPSearchRoot
)
# End of Parameters
 Process {
 }
 }


#Si j'ai un fichier strFilePathNoConnected, je charge les valeur      
$arrayComputersName = Get-ComputersFromFile $strFilePathNoConnected

#Sinon je recherche dans l'AD

$arrayComputersName = Get-ComputersFromAD "OU=Racine,DC=xxx,DC=local"

 $ObjFilter = "(objectClass=Computer)"
 $objSearch = New-Object System.DirectoryServices.DirectorySearcher
 $objSearch.PageSize = 15000
 $objSearch.Filter = $ObjFilter
#--------------------------------------------------------------------

#                               domaine
#--------------------------------------------------------------------            
$objSearch.SearchRoot = "LDAP://OU=Racine,DC=xxx,DC=local"
 
 
 $AllObj = $objSearch.FindAll()
 Start-Transcript -Path $log
 Write-host -nonewline "Vérification en cour ..." `n
 
#      Mise en place de la boucle pour chaque ordinateurs de l'AD
#-------------------------------------------------------------------
# bloucler sur $arrayComputersName
 foreach ($Obj in $AllObj)
 {
     $objItemT = $Obj.Properties
     $Computer = $objItemT.name
############# machine en cours de vérififaction et test de connection
     Write-host -nonewline "Vérification Machine $Computer" `n    
    if ( Test-Connection $Computer -count 1 -quiet )
                     
        {


            Get-WmiObject Win32_UserAccount -ComputerName $computer
        
############# groupe Administrateurs a rechercher sur le poste Administrateurs
            $MembresAdmin =""
            $Connexion = [ADSI]"WinNT://$Computer/Administrateurs,group"
          
            
#===============================================================================================================================================================================================            
############# remplacement admin* par *admin* (xxx\admin...)
            $MembresAdmin = $Connexion.psbase.invoke('Members') | %{$_.GetType().InvokeMember('Name','GetProperty', $null, $_, $null)}| Where-Object {$_ -notlike "*admin*" -and $_ -notlike ""}
            if ( !$MembresAdmin )
                {
                   Write-host -nonewline "Machine $Computer testé mais sans compte admin local" `n                   
                }
#===============================================================================================================================================================================================
            else
                {
                   Write-host -nonewline "Machine $Computer connecté avec compte administrateur local"`n
                   
                   "Nom de la machine , Nom du compte
                   $Computer , $MembresAdmin
                   ------------"  |  Out-File -filepath $strFilePathResut -encoding ASCII -append
                }  
            $v++
        }
   else
        {
           Write-host -nonewline "Machine $Computer non conectées" `n
           "Machine non teste;
            $Computer;
            ------------" |  Out-File -filepath $strFilePathNoConnected -encoding ASCII -append
            $n++
        }


 }

Write-host "il y a $n machines deconectées"  
Write-host "il y a $v machines conectées"  
$w=$n+$v
Write-Host "Il y a $w machines"
Write-host -nonewline "Vérification terminé"
Stop-Transcript

========================= 2 iem points =======================================
concernant la gestion des fichiers
il faut que tous les fichier log soit enregistré donc a la creation des log le nom doit changer par exemple logdate+heure.rtf ou un autre systeme plus facile ^^
ensuite que mon fichier csv des machine non connecter soit suprimee et remplacer par la sauveguarde du nouveau passage sinon j'ai un probleme dupplication

merci d'avance pour votre aide
je suis dispo pour toute infos complementaires

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

Plus d'informations
il y a 2 ans 4 mois #31573 par Plarox
j'ai remplis les 2 fonctions
dans les 2 cas la variable $arrayComputersName contient bien les nom des machine a tester que sa soit via le fichier csv dans la fonction Get-ComputersFromFile
ou via l'AD avec la fonction Get-ComputersFromAD ce qui donne
Function Get-ComputersFromFile {
Param ([string]$ComputersName)
$ComputersName = Import-CSV -path "C:\temp\NotestAdminLocal.csv"  -Encoding UTF8
}



Function Get-ComputersFromAD {
Param ([string]$ComputersName)
#-------------------- Domaine ---------------------------------------
 $adFilter = "(objectClass=Computer)"
 $adSearch = New-Object System.DirectoryServices.DirectorySearcher
 $adSearch.PageSize = 15000
 $adSearch.Filter = $adFilter        
 $adSearch.SearchRoot = "LDAP://OU=Racine,DC=xxxx,DC=local"
 $adall = $adSearch.FindAll()
 $adItemT = $Adall.Properties
 $ComputersName = $adItemT.name
 }

ensuite je fait ma condition     - si j'ai le fichier csv je charge les valeur de la fonction Get-ComputersFromFile
                                                -sinon je charge les valeurs de la fonction Get-ComputersFromAD
 #===============================================================================
#Si j'ai un fichier strFilePathNotConnected, je charge les valeur
if (Test-Path "C:\temp\NotestAdminLocal.csv"){
$arrayComputersName = Get-ComputersFromFile $ComputersName
}
#===============================================================================
#===============================================================================
#Sinon je recherche dans l'AD
else
{$arrayComputersName = Get-ComputersFromAD $ComputersName
}
#===============================================================================

une fois les valeurs charger dans la variable $arrayComputersName je doit faire une boucle pour que tous les ligne soit traiter par mon code
qu'est ce que je doit mettre dans mon foreach ???
foreach ( JeMetQuoi in $arrayComputersName)
 

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

Plus d'informations
il y a 2 ans 4 mois - il y a 2 ans 4 mois #31577 par Philippe
salut plarox

alors pour la boucle, oui tu doit mettre une variable, par exemple :
foreach ( $ordinateur in $arrayComputersName)
et tu utilise la variable $ordinateur dans la boucle pour les action que tu a besoin, comme fais dans la boucle :
foreach ($Obj in $AllObj)
 {
     $objItemT = $Obj.Properties
     $Computer = $objItemT.name
ou tu vois que les objets récupéré dans l'AD qui sont dans $AllObj sont mis un par un dans $obj et utilisé dans la boucle, 
sur ces deux dernières lignes, il récupère les propriétés d'un ordi dans $objitemT puis le nom de l'ordi dans $computer pour l'utilisé dans le reste de la boucle !

pour la suite de tes demande je te conseil de faire une demande de conseil à la fois, ce sera plus simple,

bon courage pour la suite :)
Dernière édition: il y a 2 ans 4 mois par Philippe.
Les utilisateur(s) suivant ont remercié: Plarox

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

Plus d'informations
il y a 2 ans 4 mois #31578 par ericlm128
Les utilisateur(s) suivant ont remercié: Plarox

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

Plus d'informations
il y a 2 ans 3 mois #31623 par ericlm128
Tu peux aussi clôturer le sujet ici si c'est terminée
Les utilisateur(s) suivant ont remercié: Plarox

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

Plus d'informations
il y a 2 ans 3 mois #31624 par Plarox
bonne idée mais malgres mes recherche je ne trouve pas le moyen de cloturer se sujet
en tous cas merci pour votre aide le script est fonctionnel.

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

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