Question guide de prod comment remplir un doc depuis wmi

Plus d'informations
il y a 16 ans 3 mois #1388 par daniel soares
bonjour ma demande est un peux particuliere
j'ai un script qui fonctionne mais qui pourrait surement etre amelioré
je le publie donc en comptant sur qui veut bien pour m'apporter des solutions plus interessantes en matiere de performance ou de lisibilité

le script permet de remplir des documents word en fonction d'interrogations wmi sur des serveurs

question subsidiaire
1 / qqun sait il comment creer un tableau a un endroit precis d'un document word par exemple juste en dessous du paragraphe 2.4
ou comment faire une recherche sur un mot dans tous le document pour le remplacer par un autre mot

voici le code
[code:1]
#
# lancer le script depuis le repertoire ou se trouve le(s) guides(s) de prod
# il peut y avoir plusieurs fichier sous la forme GP_XXXXX.doc
# tous les serveurs concernés doivent utiliser le meme compte pour login
#
function give-language{
switch ($operatingsystem.oslanguage){
1{\"Arabic\";return}
4{\"Chinese\";return}
9{\"English\";return}
1025{\"Arabic Saudi Arabia\";return}
1026{\"Bulgarian\";return}
1027{\"Catalan\";return}
1028{\"Chinese (Traditional) Taiwan\";return}
1029{\"Czech\";return}
1030{\"Danish\";return}
1031{\"German Germany\";return}
1032{\"Greek\";return}
1033{\"English United States\";return}
1034{\"Spanish Traditional Sort\";return}
1035{\"Finnish\";return}
1036{\"French France\";return}
1037{\"Hebrew\";return}
1038{\"Hungarian\";return}
1039{\"Icelandic\";return}
1040{\"Italian Italy\";return}
1041{\"Japanese\";return}
1042{\"Korean\";return}
1043{\"Dutch Netherlands\";return}
1044{\"Norwegian Bokmal\";return}
1045{\"Polish\";return}
1046{\"Portuguese Brazil\";return}
1047{\"RhaetoRomanic\";return}
1048{\"Romanian\";return}
1049{\"Russian\";return}
1050{\"Croatian\";return}
1051{\"Slovak\";return}
1052{\"Albanian\";return}
1053{\"Swedish\";return}
1054{\"Thai\";return}
1055{\"Turkish\";return}
1056{\"Urdu\";return}
1057{\"Indonesian\";return}
1058{\"Ukrainian\";return}
1059{\"Belarusian\";return}
1060{\"Slovenian\";return}
1061{\"Estonian\";return}
1062{\"Latvian\";return}
1063{\"Lithuanian\";return}
1065{\"Persian\";return}
1066{\"Vietnamese\";return}
1069{\"Basque\";return}
1070{\"Serbian\";return}
1071{\"Macedonian (FYROM)\";return}
1072{\"Sutu\";return}
1073{\"Tsonga\";return}
1074{\"Tswana\";return}
1076{\"Xhosa\";return}
1077{\"Zulu\";return}
1078{\"Afrikaans\";return}
1080{\"Faeroese\";return}
1081{\"Hindi\";return}
1082{\"Maltese\";return}
1084{\"Gaelic\";return}
1085{\"Yiddish\";return}
1086{\"Malay Malaysia\";return}
2049{\"Arabic Iraq\";return}
2052{\"Chinese (Simplified) PRC\";return}
2055{\"German Switzerland\";return}
2057{\"English United Kingdom\";return}
2058{\"Spanish Mexico\";return}
2060{\"French Belgium\";return}
2064{\"Italian Switzerland\";return}
2067{\"Dutch Belgium\";return}
2068{\"Norwegian Nynorsk\";return}
2070{\"Portuguese Portugal\";return}
2072{\"Romanian Moldova\";return}
2073{\"Russian Moldova\";return}
2074{\"Serbian Latin\";return}
2077{\"Swedish Finland\";return}
3073{\"Arabic Egypt\";return}
3076{\"Chinese (Traditional) Hong Kong SAR\";return}
3079{\"German Austria\";return}
3081{\"English Australia\";return}
3082{\"Spanish International Sort\";return}
3084{\"French Canada\";return}
3098{\"Serbian Cyrillic\";return}
4097{\"Arabic Libya\";return}
4100{\"Chinese (Simplified) Singapore\";return}
4103{\"German Luxembourg\";return}
4105{\"English Canada\";return}
4106{\"Spanish Guatemala\";return}
4108{\"French Switzerland\";return}
5121{\"Arabic Algeria\";return}
5127{\"German Liechtenstein\";return}
5129{\"English New Zealand\";return}
5130{\"Spanish Costa Rica\";return}
5132{\"French Luxembourg\";return}
6145{\"Arabic Morocco\";return}
6153{\"English Ireland\";return}
6154{\"Spanish Panama\";return}
7169{\"Arabic Tunisia\";return}
7177{\"English South Africa\";return}
7178{\"Spanish Dominican Republic\";return}
8193{\"Arabic Oman\";return}
8201{\"English Jamaica\";return}
8202{\"Spanish Venezuela\";return}
9217{\"Arabic Yemen\";return}
9226{\"Spanish Colombia\";return}
10241{\"Arabic Syria\";return}
10249{\"English Belize\";return}
10250{\"Spanish Peru\";return}
11265{\"Arabic Jordan\";return}
11273{\"English Trinidad\";return}
11274{\"Spanish Argentina\";return}
12289{\"Arabic Lebanon\";return}
12298{\"Spanish Ecuador\";return}
13313{\"Arabic Kuwait\";return}
13322{\"Spanish Chile\";return}
14337{\"Arabic U.A.E.\";return}
14346{\"Spanish Uruguay\";return}
15361{\"Arabic Bahrain\";return}
15370{\"Spanish Paraguay\";return}
16385{\"Arabic Qatar\";return}
16394{\"Spanish Bolivia\";return}
17418{\"Spanish El Salvador\";return}
18442{\"Spanish Honduras\";return}
19466{\"Spanish Nicaragua\";return}
20490{\"Spanish Puerto Rico\";return}
}
}
$process = {
#
hardware
Write-Progress -Activity \"recuperation Infos Hardware\" -status \"en cours\" -Id 1 -perc (10)
$document.content.tables.item(3).cell(2,2).range.text = $computersystem.name
$document.content.tables.item(3).cell(4,2).range.text = $computersystem.systemtype
$document.content.tables.item(3).cell(5,2).range.text = $computersystem.model
$document.content.tables.item(3).cell(6,2).range.text = [string]$computersystem.NumberofProcessors +\" X \" +[string]$processor.maxclockspeed
$document.content.tables.item(3).cell(7,2).range.text = [string][math]::round($computersystem.TotalPhysicalMemory/1GB«»)
$document.content.tables.item(3).cell(7,2).range.insertafter(\" GO\"«»)
$document.content.tables.item(3).cell(8,2).range.text =$bios.serialnumber
$document.content.tables.item(3).cell(20,3).range.text =($logicaldisk | Where-Object {$_.DriveType -eq5}).deviceId
#
cartes reseau
$document.Content.Tables.Item(7).Range.Copy()
for($index=1;$index -lt $networkconf.count;$index++){$document.Content.Tables.Item(7).Range.Paste()}
$increment=0
foreach ($net in $networkconf){
$document.content.tables.item(7).cell(1+$increment,2).range.text =$net.description
$document.content.tables.item(7).cell(2+$increment,2).range.text =\"Yes\"
$document.content.tables.item(7).cell(3+$increment,2).range.text =$net.IPAddress
$document.content.tables.item(7).cell(4+$increment,2).range.text =$net.IPSubnet
$document.content.tables.item(7).cell(5+$increment,2).range.text =$net.DefaultIPGateway
$dnsindex=0
foreach ($dnsitem in $net.DNSServerSearchOrder){
if ($dnsindex -eq 0){
$document.content.tables.item(7).cell(6+$increment,2).range.text =$dnsitem
$document.content.tables.item(7).cell(7+$increment,2).range.text =\"\"
}
else{$document.content.tables.item(7).cell(7+$increment,2).range.insertafter($dnsitem+\" \"«»)}
$dnsindex++
}
$document.content.tables.item(7).cell(8+$increment,2).range.text =$net.WINSPrimaryServer
$document.content.tables.item(7).cell(9+$increment,2).range.text =$net.WINSSecondaryServer
$increment+=10
Write-Progress -Activity \"recuperation Infos Reseau\" -status \"en cours\" -Id 1 -perc (10)
}
#
systeme d'exploitation
Write-Progress -Activity \"recuperation Infos OS\" -status \"en cours\" -Id 1 -perc (10)
$document.content.tables.item(9).cell(2,2).range.text =$operatingsystem.caption
$document.content.tables.item(9).cell(3,2).range.text =$operatingsystem.version
$document.content.tables.item(9).cell(4,2).range.text =$operatingsystem.csdversion
$document.content.tables.item(9).cell(5,2).range.text =give-language $operatingsystem.oslanguage
$document.content.tables.item(9).cell(6,2).range.text =\"\"
$document.content.tables.item(9).cell(7,2).range.text =\"\"
$document.content.tables.item(9).cell(8,2).range.text =$operatingsystem.registereduser
$document.content.tables.item(9).cell(9,2).range.text =$operatingsystem.organization
$document.content.tables.item(9).cell(10,2).range.text =$timezone
#
Partitions
Write-Progress -Activity \"recuperation Infos Volumes\" -status \"en cours\" -Id 1 -perc (10)
$Ajoutligne = ($logicaldisk | Where-Object {$_.DriveType -eq 3}).count - $document.Content.Tables.Item(10).Rows.Count+1
for ($index=0;$index -lt $ajoutligne;$index++){$document.Content.Tables.Item(10).Rows.add()}
$diskindex=0
foreach ($disk in ($logicaldisk | Where-Object {$_.DriveType -eq 3})){
$document.content.tables.item(10).cell(2+$diskindex,1).range.text =$disk.deviceID
$document.content.tables.item(10).cell(2+$diskindex,2).range.text =$disk.VolumeName
$document.content.tables.item(10).cell(2+$diskindex,3).range.text =[string]([math]::round($disk.SIZE/1GB,2))
$document.content.tables.item(10).cell(2+$diskindex,3).range.insertafter(\" GO\"«»)
$document.content.tables.item(10).cell(2+$diskindex,4).range.text =$disk.FileSystem
$document.content.tables.item(10).cell(2+$diskindex,5).range.text =\"Default\"
$diskindex++
}
#
services
$Ajoutligne = $services.count - $document.Content.Tables.Item(11).Rows.Count+1
while ($Ajoutligne -ne 0){
if ($ajoutligne -lt 0){$document.Content.Tables.Item(11).Rows.Last.Delete()}
if ($ajoutligne -gt 0){$document.Content.Tables.Item(11).Rows.add()}
$Ajoutligne = $services.count - $document.Content.Tables.Item(11).Rows.Count+1
}
$serviceindex=0
foreach ($service in ($services)){
$document.content.tables.item(11).cell(2+$serviceindex,1).range.text =$service.caption
$document.content.tables.item(11).cell(2+$serviceindex,2).range.text =$service.state
$document.content.tables.item(11).cell(2+$serviceindex,3).range.text =$service.startmode
$document.content.tables.item(11).cell(2+$serviceindex,4).range.text =$service.startname
$serviceindex++
Write-Progress -Activity \"renseignement Services\" -status $service.caption -id 1 -perc ($serviceindex/$services.count*100)
}
#
programmes
$Ajoutligne = $products.count - $document.Content.Tables.Item(12).Rows.Count+1
while ($Ajoutligne -ne 0){
if ($ajoutligne -lt 0){$document.Content.Tables.Item(12).Rows.Last.Delete()}
if ($ajoutligne -gt 0){$document.Content.Tables.Item(12).Rows.add()}
$Ajoutligne = $products.count - $document.Content.Tables.Item(12).Rows.Count+1
}
$productindex=0
foreach ($product in ($products)){
$document.content.tables.item(12).cell(2+$productindex,1).range.text =$product.name
$document.content.tables.item(12).cell(2+$productindex,2).range.text =$product.vendor
$document.content.tables.item(12).cell(2+$productindex,3).range.text =$product.version
$productindex++
if ($product.name -eq $null){$prog =\"
\"}
else {$prog = $product.name}
Write-Progress -Activity \"renseignement Programmes\" -status $prog -id 1 -perc ($productindex/$products.count*100)
}
#
fin de process document
$document.close()
}
#
# Programme
#
#
recherche les docs de type GP_XXXXXX.doc
cls
$credential = Get-Credential $compte
$word= New-Object -ComObject word.application
get-childitem | Where-Object {$_ -match \"^GP_+[a-z0-9\-]+\.doc$\"} |foreach {
#
barre defilement doc
$i++
$ordinateur =($_.name.split(\"_\"\".\"«»))[1]
$document = $word.documents.open($_.fullname)
if((get-childitem | Where-Object {$_ -match \"^GP_+[a-z0-9\-]+\.doc$\"}).count -ge 1)
{$NbDocument = (get-childitem | Where-Object {$_ -match \"^GP_+[a-z0-9\-]+\.doc$\"}).count}
else
{$NbDocument = 1}
Write-Progress -Activity \"document\" -status $_.fullname -perc ($i/$NbDocument*100)
#
WMI request
$computersystem = Get-WmiObject Win32_computersystem -computername $ordinateur -credential $credential
Write-Progress -Activity \"interrogation WMI\" -status \"en cours\" -Id 1 -perc (10)
$bios = Get-WmiObject Win32_bios -computername $ordinateur -credential $credential
Write-Progress -Activity \"interrogation WMI\" -status \"en cours\" -Id 1 -perc (20)
$logicaldisk = Get-WmiObject Win32_logicaldisk -computername $ordinateur -credential $credential
Write-Progress -Activity \"interrogation WMI\" -status \"en cours\" -Id 1 -perc (30)
$processor = Get-WmiObject Win32_processor -computername $ordinateur -credential $credential | Where-Object {$_.deviceid -eq \"cpu0\"}
Write-Progress -Activity \"interrogation WMI\" -status \"en cours\" -Id 1 -perc (40)
$timezone = (Get-WmiObject win32_timezone -ComputerName $ordinateur -Credential $credential).caption
Write-Progress -Activity \"interrogation WMI\" -status \"en cours\" -Id 1 -perc (50)
$operatingsystem = Get-WmiObject Win32_operatingsystem -computername $ordinateur -credential $credential
Write-Progress -Activity \"interrogation WMI\" -status \"en cours\" -Id 1 -perc (60)
$logicaldisk = Get-WmiObject Win32_logicaldisk -computername $ordinateur -credential $credential
Write-Progress -Activity \"interrogation WMI\" -status \"en cours\" -Id 1 -perc (70)
$networkconf = Get-WmiObject Win32_NetworkAdapterConfiguration -computername $ordinateur -credential $credential | Where-Object {$_.ipaddress -ne $null}
Write-Progress -Activity \"interrogation WMI\" -status \"en cours\" -Id 1 -perc (80)
$services = Get-WmiObject win32_service -ComputerName $ordinateur -Credential $credential
Write-Progress -Activity \"interrogation WMI\" -status \"en cours\" -Id 1 -perc (90)
$products = get-wmiobject win32_product -ComputerName $ordinateur -Credential $credential
Write-Progress -Activity \"interrogation WMI\" -status \"en cours\" -Id 1 -perc (100)
&$process
}
$word.quit()
[/code:1]

je joint le fichier dans un deuxiemme post<br><br>Message édité par: Dan, à: 21/12/07 16:03

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

Plus d'informations
il y a 16 ans 3 mois #1390 par daniel soares
voici une version light du fichier a remplir par le script

une demande specifique pour JANEL si tu passes dans le coin :)
je n'arrive pas a implementer la solution d'enregistrement des credentials dans un fichier
je n'ai pas la commande export-credential
et lorsque j'utilise $cred = get-content ($ficher contenant le credential)
powershell ne sait pas le lire
d'ailleur il ne possede pas les proprietés username et password
pourtant le fichier est bien cree

...

La pièce jointe GP_nomserveur.zip est absente ou indisponible

Pièces jointes :

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

Plus d'informations
il y a 16 ans 3 mois #1396 par Jacques Barathon
Hello,

Je reviens de quelques jours de repos, nécessaires après une fin d'année très chargée!

Je répondrai aux différentes questions dans les prochains jours, mais voici tout d'abord une amélioration très simple du script posté... en remplacement de la fonction give-language, je propose la commande suivante:

[code:1][System.Globalization.CultureInfo]::GetCultureInfo($operatingsystem.oslanguage).DisplayName[/code:1]
A plus tard pour le reste... :)

Janel<br><br>Message édité par: janel, à: 28/12/07 12:24

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

Plus d'informations
il y a 16 ans 3 mois #1397 par Jacques Barathon
Dan écrit:

une demande specifique pour JANEL si tu passes dans le coin :)
je n'arrive pas a implementer la solution d'enregistrement des credentials dans un fichier
je n'ai pas la commande export-credential
et lorsque j'utilise $cred = get-content ($ficher contenant le credential)
powershell ne sait pas le lire
d'ailleur il ne possede pas les proprietés username et password
pourtant le fichier est bien cree


Je ne comprends pas: si tu n'as pas la commande export-credential, comment arrives-tu à créer le fichier contenant le credential?

La commande export-credential, comme la commande import-credential, n'est pas fournie en standard. C'est un script dont je fournissais le contenu dans mon message.

Je te redonne le contenu du script export-credential.ps1 :

[code:1]
# export-credential.ps1

param ($credential, $filename)

$credential.username &gt; $filename
convertfrom-securestring $credential.password &gt;&gt; $filename
[/code:1]
Enregistre les lignes ci-dessus dans un fichier export-credential.ps1, et assure-toi que ce fichier est dans un répertoire présent dans la variable d'environnement PATH. Tu devrais ensuite pouvoir t'en servir pour créer un fichier contenant les credentials du compte que tu veux utiliser de manière automatisée:

[code:1]
PS&gt; $cred = get-credential moncompteadmin
PS&gt; export-credential $cred moncompteadmin.txt
[/code:1]
A partir de là, tu dois pouvoir relire le fichier moncompteadmin.txt avec la commande import-credential. Le relire avec get-content directement ne donnera pas grand-chose car get-content ne fera que te retourner les quatre lignes que contient le fichier, sans savoir quoi faire de chacune de ces quatre lignes.

Bon courage. Tiens-moi au courant.

Janel

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

Plus d'informations
il y a 16 ans 3 mois #1425 par daniel soares
Hello Janel
pour la commande permettant de retrouver en une ligne la langue utilisée ca fonctionne mais a moitier je pense que le pb n'est pas bien grave... voici le resultat de la commande tel que tu me la donne
[code:1]
PS C:\daniel&gt; [System.Globalization.CultureInfo]::GetCultureInfo($a.oslanguage).DisplayName
Exception calling \&quot;GetCultureInfo\&quot; with \&quot;1\&quot; argument(s): \&quot;Le nom de culture '1033' n'est pas pris en charge.
Nom du paramètre : name\&quot;
At line:1 char:51
+ [System.Globalization.CultureInfo]::GetCultureInfo &lt;&lt;&lt;&lt; ($a.oslanguage).DisplayName
[/code:1]

si je remplace $a.oslanguage par sa valeur 1033 ça fonctionne
[code:1]
[System.Globalization.CultureInfo]::GetCultureInfo(1033).DisplayName
[/code:1]
pourtant $a.oslanguage est bien un nombre
sais tu expliquer ce probleme?

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

Plus d'informations
il y a 16 ans 3 mois #1431 par Arnaud Petitjean
Salut Dan,

L'idée de ce script est tout simplement excellente !!! :woohoo:

Je ne suis pas en mesure de le tester pour l'instant mais voici mes premiers commentaires en vue de l'améliorer :
  • L'identation est à revoir pour plus de lisibilité,
  • Baser le scan d'une machine par rapport au nom du rapport ne me semble pas extraordinaire. Il serait peut-être mieux d'avoir un rapport type (vide) et de le cloner pour chaque serveur à analyser. Comme ça on pourrait envisager de passer les noms des serveurs, soit directement sur la ligne de commandes, soit dans un fichier texte,
  • Avec quelle version de Word as tu testé ton script ? Je te demande cela car il y a des fois certaines incompatibilités entre Word 2003 et Word 2007 au niveau de PowerShell. En effet, les composants COM ne sont pas tout à fait les mêmes entre ces 2 versions,
  • Pourrais tu poster un exemple de rapport déjà rempli pour avoir une meilleure idée du résultat final STP ?

En tout cas bravo, et j'espère que tu vas aller jusqu'au bout de ce script ! :)

Arnaud<br><br>Message édité par: Arnaud, à: 8/01/08 17:57

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

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

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