Question Récupération des serveurs dans AD (Résolu)

Plus d'informations
il y a 16 ans 6 mois #972 par Jacques Barathon
A priori, un ordinateur n'a qu'un OperatingSytem de déclaré, tu ne devrais donc pas avoir à préciser que tu veux l'item 0 de la collection. Mais sinon, perso j'écrirais plutôt:

$_.properties.operatingsystem[0]

Autrement, tu devrais pouvoir te passer de ton filtre where-object (et incidemment accélérer ta requête) en configurant le filtre LDAP lui-même:

[code:1]
PS> $search.filter = \"(&(ObjectCategory=computer)(operatingsystem=*Server*))\"
PS> $result = $search.FindAll()
PS> $result | ft {$_.properties.cn},{$_.properties.operatingsystem} -a
$_.properties.cn $_.properties.operatingsystem

SMTSRV04 Windows Server 2003
DCSRV06 Windows Server 2003
PAREFEU03 Windows Server 2003
FILSRV03 Windows Server 2003
FILSRV01 Windows 2000 Server
STO-MAIN-02 Windows 2000 Server
MUC-FILE-01 Windows .NET Server
TESTSRV05 Windows Server™ Code Name \"Longhorn\"[/code:1]
Comme tu peux le voir dans l'exemple ci-dessus, le filtre '*server*' ouvre un peu plus le champ des résultats. Tu peux utiliser la même syntaxe pour restreindre comme tu l'avais fait à 'Windows 2000 Server' et 'Windows Server 2003'. Il faudra combiner les deux valeurs possibles avec un filtre sous la forme:

\"(&(ObjectCategory=Computer)(|(OperatingSystem='Windows 2000 Server')(OperatingSystem='Windows Server 2003')))\"

Janel

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

Plus d'informations
il y a 16 ans 6 mois #974 par bordin
janel écrit:

A priori, un ordinateur n'a qu'un OperatingSytem de déclaré, tu ne devrais donc pas avoir à préciser que tu veux l'item 0 de la collection. Mais sinon, perso j'écrirais plutôt:

$_.properties.operatingsystem[0]

Autrement, tu devrais pouvoir te passer de ton filtre where-object (et incidemment accélérer ta requête) en configurant le filtre LDAP lui-même:

[code:1]
PS> $search.filter = \"(&(ObjectCategory=computer)(operatingsystem=*Server*))\"
PS> $result = $search.FindAll()
PS> $result | ft {$_.properties.cn},{$_.properties.operatingsystem} -a
$_.properties.cn $_.properties.operatingsystem



SMTSRV04 Windows Server 2003
DCSRV06 Windows Server 2003
PAREFEU03 Windows Server 2003
FILSRV03 Windows Server 2003
FILSRV01 Windows 2000 Server
STO-MAIN-02 Windows 2000 Server
MUC-FILE-01 Windows .NET Server
TESTSRV05 Windows Server™ Code Name \"Longhorn\"[/code:1]
Comme tu peux le voir dans l'exemple ci-dessus, le filtre '*server*' ouvre un peu plus le champ des résultats. Tu peux utiliser la même syntaxe pour restreindre comme tu l'avais fait à 'Windows 2000 Server' et 'Windows Server 2003'. Il faudra combiner les deux valeurs possibles avec un filtre sous la forme:

\"(&(ObjectCategory=Computer)(|(OperatingSystem='Windows 2000 Server')(OperatingSystem='Windows Server 2003')))\"

Janel


Salut,
Voila j'ai adapté avec tes conseils, ca donne çà:
[code:1]$root= new-object System.DirectoryServices.DirectoryEntry(\"LDAP://RootDSE\"«»);
$domain=[adsi](\"LDAP://\" + $root.Get(\"defaultNamingContext\"«»));
$search = new-object System.DirectoryServices.DirectorySearcher($domain)
$search.filter = '(&(ObjectCategory=computer)(operatingsystem=*Server*))'
$result = $search.FindAll()
$result | select @{n=\"Nom Serveur\";e={$_.properties.cn}},@{n=\"System Exploitattion\";e={$_.properties.operatingsystem}}[/code:1]
C'est plus rapide, et c'est tout ce que je voulais avoir comme infos!
Mais comment pourrais t'on au mieux remonter ces valeurs dans une listebox d'une Form par exemple?
1. export-cvs puis import-csv dans une variable qu'on passe à la listbox
2. Ou autre methode?
Merci beaucoup Janel.

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

Plus d'informations
il y a 16 ans 6 mois #975 par Jacques Barathon
Je ne crois pas qu'une ListBox soit ce qu'il te faut. Ce contrôle, à ma connaissance, n'affiche qu'un seul champ par élément, or toi tu en as deux (nom du serveur et OS).

Je te propose plutôt d'utiliser une DataGridView. Pour ce faire, j'ai adapté en le simplifiant un script publié sur l'excellent site de MOW, thePowerShellGuy.com . Ce script, que j'ai rebaptisé out-datagrid, affichera n'importe quelle collection d'objets dans un Windows Form avec la possibilité de trier selon la colonne que l'on veut:

[code:1]
# out-datagrid.ps1
#
# Auteur: MOW (adaptation de janel)
#
# Transmet les objets émis par le pipeline
# à un contrôle DataGridView.
#
# Usage:
#
# <commande> | out-datagrid
#
[Reflection.Assembly]::LoadWithPartialName(\"System.Windows.Forms\"«») > $null

$datatable = new-object System.Data.DataTable

$first = $true
foreach ($item in $input) {
$datarow = $datatable.NewRow()
$item.PsObject.get_properties() | foreach {
if ($first)
{
$col = new-object Data.DataColumn
$col.ColumnName = $_.Name.ToString()
$datatable.Columns.Add($col)
}
if ($_.Value -eq $null)
{
$datarow.Item($_.Name) = \"[empty]\"
}
elseif ($_.IsArray)
{
$datarow.Item($_.Name) = [String]::Join($_.Value,\";\"«»)
}
else
{
$datarow.Item($_.Name) = $_.Value
}
}
$datatable.Rows.Add($datarow)
$first = $false
}

$datagrid = new-object System.Windows.Forms.DataGridView

$datagrid.Dock = \"Fill\"
$datagrid.AutoSizeColumnsMode = \"Fill\"
$datagrid.ColumnHeadersHeightSizeMode = \"AutoSize\"
$datagrid.SelectionMode = \"FullRowSelect\"
$datagrid.DataSource = $datatable.PSObject.BaseObject

$form = new-object System.Windows.Forms.Form
$form.Controls.Add($datagrid)
$form.ShowDialog()[/code:1]
Tu pourras alors t'en servir comme suit:

[code:1]
$result | select @{n=\"Nom Serveur\";e={$_.properties.cn}},@{n=\"System Exploitattion\";e={$_.properties.operatingsystem}} | out-datagrid[/code:1]
Enjoy! :)

Janel

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

Plus d'informations
il y a 16 ans 6 mois #976 par bordin
Salut, tout simplement EXCELLENT! :woohoo:
Merci O Sensei Janel !!!!
Je pourrais avec çà afficher mes serveurs dans une form.

Mais je t'exprime ici le pourquoi de la chose.
Je souhaite charger une Form avec une liste de serveur (Datagrid). Lorsque je sélectionne un serveur, je veux afficher une liste de service dans une autre listebox ou datagrid en cliquant sur un bouton par exemple, etc..

Est ce que c'est faisable?
Est ce qu'on peut exécuter des commandes powershell en cliquant un bouton sur une form?

===> interface d'admin PS perso!!!!!
Merci pour ton aide!

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

Plus d'informations
il y a 16 ans 6 mois #983 par Jacques Barathon
Oui, on peut tout à fait passer du code à exécuter suite à un clic sur un bouton ou n'importe quelle autre action prévue sur un contrôle.

Le principe, c'est qu'il faut passer le code à exécuter sous la forme d'un ScriptBlock. Très simplement, un ScriptBlock est une suite d'instructions PowerShell encadrées par des accolades:

[code:1]$monScriptBlock = {
\"Hello world!\"
}[/code:1]
Dans l'exemple ci-dessus, $monScriptBlock est une variable qui stocke une seule instruction archi-basique. Tu noteras qu'après l'accolade ouverte on peut aller à la ligne et construire une suite d'instructions aussi longue et complexe que l'on veut.

Ensuite, on n'a plus qu'à affecter le ScriptBlock à l'action voulue. Pour cela, il faut regarder dans les méthodes du contrôle, celles qui commencent par On. Par exemple, pour un bouton tu as l'action OnClick(). Tu auras compris qu'il s'agit de la méthode à utiliser en cas de clic sur le bouton.

Petite subtilité, dans PowerShell il faudra transformer le nom OnClick() en Add_Click(). Cette transformation est valable pour toutes les méthodes commençant par le mot On. Autre exemple, sur une DataGridView tu as la méthode OnCellMouseDoubleClick() qui est appelée quand on double-clique sur une cellule: dans PowerShell on l'appellera Add_CellMouseDoubleClick().

Une fois le nom de méthode repéré, l'affectation se fait simplement ainsi:

[code:1]$monBouton.Add_Click() = $monScriptBlock[/code:1]
Et voilà.

Pour en revenir à ton besoin précis, le code de ton ScriptBlock peut manipuler un autre contrôle, comme par exemple une autre DataGridView. Il suffit que tu aies déjà créé le contrôle dans ton code principal et que tu t'y réfères par son nom.

A titre d'exemple concret, tu peux jeter un oeil à mon code pour la création d'un bouton lançant l'impression d'un formulaire:

powershell-scripting.com/index.php?optio...p;id=869&catid=5

Tiens-nous au courant!

Janel<br><br>Message édité par: janel, à: 24/09/07 10:41

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

Plus d'informations
il y a 16 ans 6 mois #986 par bordin
Salut,

Merci Janel pour tes explications!

Je crois avoir les infos qui m'interressent. Je suis entrain de créer mon Form avec tous les controles.

Je vous tiens au courant pour la suite!

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

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