<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SysKB.com&#187; Scripting &#8211; SysKB IT Knowledge Base</title>
	<atom:link href="http://syskb.com/category/kb/scripting/feed/" rel="self" type="application/rss+xml" />
	<link>http://syskb.com</link>
	<description>Base de connaissance IT</description>
	<lastBuildDate>Thu, 29 Jul 2010 10:33:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>La taille d&#8217;un dossier en PoSh</title>
		<link>http://syskb.com/la-taille-dun-dossier-en-posh/</link>
		<comments>http://syskb.com/la-taille-dun-dossier-en-posh/#comments</comments>
		<pubDate>Sat, 01 May 2010 17:40:48 +0000</pubDate>
		<dc:creator>OrDuCom1</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[file system]]></category>
		<category><![CDATA[powershell]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=3085</guid>
		<description><![CDATA[Dans le bon temps, nous avions accès à la propriété &#8220;Size&#8221; d&#8217;un objet &#8216;Dossier&#8217; avec le FileSystemObject (le &#8216;FSO&#8217;) . Dans PowerShell (que j&#8217;aime bien quand même) la propriété n&#8217;est plus aussi simplement accessible. Je me suis fait une petite fonction toute simple pour la retrouver &#8230; La ligne de code principale est la suivante [...]]]></description>
			<content:encoded><![CDATA[<p>Dans le bon temps, nous avions accès à la propriété &#8220;Size&#8221; d&#8217;un objet &#8216;Dossier&#8217; avec le FileSystemObject (le &#8216;FSO&#8217;) . Dans PowerShell (que j&#8217;aime bien quand même) la propriété n&#8217;est plus aussi simplement accessible. Je me suis fait une petite fonction toute simple pour la retrouver &#8230;</p>
<p><span id="more-3085"></span>La ligne de code principale est la suivante :</p>
<pre>(Get-ChildItem -Path "C:\mesScripts" -Recurse | measure-object Length -sum).Sum
</pre>
<p>C&#8217;est bien jolie et fonctionnel mais à caser dans une boucle ou une condition, ça prend de la place &#8230; Me fallait donc faire ma petite fonction pour rendre ça plus fonctionnel, la voilà :</p>
<pre>Function ArboSize([string]$FolderPath, [string]$frmt)
{
 $MySize = (Get-ChildItem -Path $FolderPath -Recurse | measure-object Length -sum).Sum

 Switch ($frmt) {
 kb {Return [double]($MySize/1KB)}
 mb {Return [double]($MySize/1MB)}
 gb {Return [double]($MySize/1GB)}
 tb {Return [double]($MySize/1TB)}
 default {Return [double]$MySize}
 }
}</pre>
<p>Il suffit d&#8217;appeler la fonction comme suit :</p>
<pre>ArboSize &lt;chemin&gt; &lt;format&gt;
</pre>
<p>format disponnible : &#8220;kb&#8221; &#8211; &#8220;mb&#8221; &#8211; &#8220;gb&#8221; &#8211; &#8220;tb&#8221;. Si omis, le résultat sera en bits. Cette option est à choisir si vous devez effectuer une/des opération(s) arithmétique.</p>
<p>Aller, un petit exemple pour bien situer. La 2ème ligne, c&#8217;est pour formater la sortie avec 2 chiffres après la virgule (1,23)</p>
<pre>$FolderSize = ArboSize "C:\mesScripts" "mb"
"{0:N2}" -f $FolderSize</pre>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/la-taille-dun-dossier-en-posh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Envoyer un mail en Powershell</title>
		<link>http://syskb.com/envoyer-un-mail-en-powershell/</link>
		<comments>http://syskb.com/envoyer-un-mail-en-powershell/#comments</comments>
		<pubDate>Mon, 05 Apr 2010 13:31:36 +0000</pubDate>
		<dc:creator>hatmos</dc:creator>
				<category><![CDATA[Groupware et Messagerie]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[mailing]]></category>
		<category><![CDATA[powershell]]></category>
		<category><![CDATA[SMTP]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=2962</guid>
		<description><![CDATA[Ce script Powershell permet d&#8217;envoyer un mail très simplement via un serveur SMTP. Prérequis Comment installer et exécuter PowerShell sur un système Windows Exécuter un script en PowerShell Code $SmtpClient = new-object system.net.mail.smtpClient $SmtpServer = "localhost" $SmtpClient.host = $SmtpServer $From = "Lecteur de SysKB &#60;lecteur@exemple.fr&#62;" $To = webmaster@syskb.com $Title = "Script Powershell" $Body = "Le [...]]]></description>
			<content:encoded><![CDATA[<p>Ce script Powershell permet d&#8217;envoyer un mail très simplement via un serveur SMTP.</p>
<h3><strong>Prérequis</strong></h3>
<p style="padding-left: 30px;"><a href="../comment-installer-powershell-10/">Comment  installer et exécuter PowerShell sur un système Windows</a></p>
<p style="padding-left: 30px;"><a href="../comment-executer-un-script-en-powershell/">Exécuter  un script en PowerShell</a></p>
<h3>Code</h3>
<pre><span style="font-size: x-small;"><span style="font-family: Verdana;">$SmtpClient = new-object  system.net.mail.smtpClient
</span></span><span style="font-size: x-small;"><span style="font-family: Verdana;">$SmtpServer = "localhost"
</span></span><span style="font-size: x-small;"><span style="font-family: Verdana;">$SmtpClient.host =
$SmtpServer</span></span><span style="font-family: Verdana; font-size: x-small;"> 

</span><span style="font-size: x-small;"><span style="font-family: Verdana;">$From = "Lecteur de SysKB &lt;lecteur@exemple.fr&gt;"
</span></span><span style="font-size: x-small;"><span style="font-family: Verdana;">$To = webmaster@syskb.com
</span></span><span style="font-size: x-small;"><span style="font-family: Verdana;">$Title = "Script Powershell"
</span></span><span style="font-size: x-small;"><span style="font-family: Verdana;">$Body = "Le mail a été envoyé"</span></span><span style="font-family: Verdana; font-size: x-small;">
</span><span style="font-size: x-small;"><span style="font-family: Verdana;">$SmtpClient.Send($from,$to,$title,$Body)</span></span><span style="font-family: Verdana; font-size: x-small;"> </span><span style="font-family: Verdana; font-size: x-small;">
</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/envoyer-un-mail-en-powershell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lister les caractéristiques d&#8217;un domaine en Powershell</title>
		<link>http://syskb.com/lister-les-caracteristiques-dun-domaine-en-powershell/</link>
		<comments>http://syskb.com/lister-les-caracteristiques-dun-domaine-en-powershell/#comments</comments>
		<pubDate>Sun, 04 Apr 2010 12:50:16 +0000</pubDate>
		<dc:creator>hatmos</dc:creator>
				<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[powershell]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=2957</guid>
		<description><![CDATA[Ce script Powershell permet d&#8217;afficher les caractéristiques de votre domaine Active Directory. Prérequis Comment installer et exécuter PowerShell sur un système Windows Exécuter un script en PowerShell Auteur Microsoft Scripting Guys Référence http://www.microsoft.com/technet/scriptcenter/scripts/msh/default.mspx?mfr=true Code $strComputer = "." $colItems = get-wmiobject -class "Win32_NTDomain" -namespace "root\CIMV2" ` -computername $strComputer foreach ($objItem in $colItems) { write-host "Caption: " [...]]]></description>
			<content:encoded><![CDATA[<p>Ce script Powershell permet d&#8217;afficher les caractéristiques de votre domaine Active Directory.</p>
<h3>Prérequis</h3>
<p style="padding-left: 30px;"><a href="../comment-installer-powershell-10/">Comment  installer et  exécuter PowerShell sur un système Windows</a></p>
<p style="padding-left: 30px;"><a href="../comment-executer-un-script-en-powershell/">Exécuter  un  script en PowerShell</a></p>
<h3>Auteur</h3>
<p><em>Microsoft Scripting  Guys</em></p>
<h3>Référence</h3>
<p><em><a href="http://www.microsoft.com/technet/scriptcenter/scripts/msh/default.mspx?mfr=true">http://www.microsoft.com/technet/scriptcenter/scripts/msh/default.mspx?mfr=true</a></em></p>
<h3>Code</h3>
<pre>$strComputer = "."

$colItems = get-wmiobject -class "Win32_NTDomain" -namespace "root\CIMV2" `
-computername $strComputer

foreach ($objItem in $colItems) {
      write-host "Caption: " $objItem.Caption
      write-host "Client Site Name: " $objItem.ClientSiteName
      write-host "Creation Class Name: " $objItem.CreationClassName
      write-host "DC Site Name: " $objItem.DcSiteName
      write-host "Description: " $objItem.Description
      write-host "DNS Forest Name: " $objItem.DnsForestName
      write-host "Domain Controller Address: " $objItem.DomainControllerAddress
      write-host "Domain Controller Address Type: " $objItem.DomainControllerAddressType
      write-host "Domain Controller Name: " $objItem.DomainControllerName
      write-host "Domain GUID: " $objItem.DomainGuid
      write-host "Domain Name: " $objItem.DomainName
      write-host "DS Directory Service Flag: " $objItem.DSDirectoryServiceFlag
      write-host "DS DNS Controller Flag: " $objItem.DSDnsControllerFlag
      write-host "DS DNS Domain Flag: " $objItem.DSDnsDomainFlag
      write-host "DS DNS Forest Flag: " $objItem.DSDnsForestFlag
      write-host "DS Global Catalog Flag: " $objItem.DSGlobalCatalogFlag
      write-host "DS Kerberos Distribution Center Flag: " $objItem.DSKerberosDistributionCenterFlag
      write-host "DS Primary Domain Controller Flag: " $objItem.DSPrimaryDomainControllerFlag
      write-host "DS Time Service Flag: " $objItem.DSTimeServiceFlag
      write-host "DS Writable Flag: " $objItem.DSWritableFlag
      write-host "Installation Date: " $objItem.InstallDate
      write-host "Name: " $objItem.Name
      write-host "Name Format: " $objItem.NameFormat
      write-host "Primary Owner Contact: " $objItem.PrimaryOwnerContact
      write-host "Primary Owner Name: " $objItem.PrimaryOwnerName
      write-host "Roles: " $objItem.Roles
      write-host "Status: " $objItem.Status
      write-host
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/lister-les-caracteristiques-dun-domaine-en-powershell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Localiser son script où qu&#8217;il soit</title>
		<link>http://syskb.com/localiser-son-script-ou-quil-soit/</link>
		<comments>http://syskb.com/localiser-son-script-ou-quil-soit/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 17:44:47 +0000</pubDate>
		<dc:creator>hatmos</dc:creator>
				<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=2927</guid>
		<description><![CDATA[Dans mes scripts VBS, j&#8217;ai l&#8217;habitude d&#8217;initialiser une variable pour localiser mon script. Comme ça, si je dois le déplacer, je ne me préoccupe pas des divers chemins pour localiser mon fichier de log ou de source qui y est associé (à condition de les déplacer avec &#8230;). Pour info, la commande est la suivante [...]]]></description>
			<content:encoded><![CDATA[<p>Dans mes scripts VBS, j&#8217;ai l&#8217;habitude d&#8217;initialiser une variable pour localiser mon script. Comme ça, si je dois le déplacer, je ne me préoccupe pas des divers chemins pour localiser mon fichier de log ou de source qui y est associé (à condition de les déplacer avec &#8230;). Pour info, la commande est la suivante :</p>
<pre>strMyPath = Left(Wscript.ScriptFullName,InStrRev(Wscript.ScriptFullName, "\"))</pre>
<p>Dans mes scripts PoSH, je cherchais une solution similaire mais &#8220;Wscript.ScriptFullName&#8221; n&#8217;existe pas et n&#8217;a (semble t-il) pas d&#8217;équivalent. La ruse consiste donc à utiliser la propriété &#8220;CurrentDirectory&#8221; de l&#8217;objet &#8220;Shell&#8221; &#8230;</p>
<pre>$MyPath = ($WShell = New-Object -ComObject Wscript.Shell).CurrentDirectory</pre>
<p>Et, pour un peu, c&#8217;est presque plus simple !</p>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/localiser-son-script-ou-quil-soit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Retrouver le numéro de série d&#8217;un ordinateur distant avec Powershell</title>
		<link>http://syskb.com/retrouver-le-numero-de-serie-dun-ordinateur-distant-avec-powershell/</link>
		<comments>http://syskb.com/retrouver-le-numero-de-serie-dun-ordinateur-distant-avec-powershell/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 09:44:51 +0000</pubDate>
		<dc:creator>hatmos</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[powershell]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=2852</guid>
		<description><![CDATA[Vous êtes plongé dans la MAJ de votre inventaire et il vous manque le numéro de série d&#8217;un serveur Windows situé loin , très loin. Voici une petite ligne de commande en Powershell permettant de récupérer en WMI un numéro de série. Ouvrez l&#8217;interpréteur Powershell et exécutez le code script suivant: Get-WmiObject -Class Win32_BIOS -NameSpace [...]]]></description>
			<content:encoded><![CDATA[<p>Vous êtes plongé dans la MAJ de votre inventaire et il vous manque le numéro de série d&#8217;un serveur Windows situé loin , très loin. Voici une petite ligne de commande en Powershell permettant de récupérer en WMI un numéro de série.</p>
<p><span id="more-2852"></span></p>
<p>Ouvrez l&#8217;interpréteur Powershell et exécutez le code script suivant:</p>
<pre>Get-WmiObject -Class Win32_BIOS -NameSpace "root\CIMV2" -ComputerName [Nom_Ordinateur]
</pre>
<p>et remplacer <strong>[Nom_Ordinateur]</strong> par le nom de la machine Windows distante.</p>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/retrouver-le-numero-de-serie-dun-ordinateur-distant-avec-powershell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mon premier script PoSh avec &#8220;PrimalForms&#8221;</title>
		<link>http://syskb.com/mon-premier-script-posh-avec-primalforms/</link>
		<comments>http://syskb.com/mon-premier-script-posh-avec-primalforms/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 17:09:35 +0000</pubDate>
		<dc:creator>hatmos</dc:creator>
				<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=2888</guid>
		<description><![CDATA[Après ma découverte de PrimalForms, j&#8217;ai eu envie d&#8217;en savoir un peu plus et donc de tester un peu le produit. J&#8217;en ai profité pour faire un tutoriel pour montrer un peu les possibilités de ce logiciel. Évidement, il faut installer PrimalForms. Rendez-vous sur le site de SAPIEN Technologies pour le télécharger. L&#8217;installation en elle [...]]]></description>
			<content:encoded><![CDATA[<p>Après ma découverte de <a title="Voir le sujet sur SysKB" href="http://syskb.com/un-editeur-de-forms-pour-powershell/" target="_blank">PrimalForms</a>, j&#8217;ai eu envie d&#8217;en savoir un peu plus et donc de tester un peu le produit. J&#8217;en ai profité pour faire un tutoriel pour montrer un peu les possibilités de ce logiciel.</p>
<p><span id="more-2888"></span></p>
<p>Évidement, il faut installer PrimalForms. Rendez-vous sur le site de <a title="Télécharger PrimalForms CE" href="http://www.sapien.com/default.asp" target="_blank"><em>SAPIEN Technologies</em></a> pour le télécharger. L&#8217;installation en elle même s&#8217;effectue sans problème.</p>
<p>Nous allons faire un petit soft (un script en réalité) sans prétention qui va juste lister les membres d&#8217;un groupe locale sur l&#8217;ordinateur courant. Nous allons voir que le bout de code dédier au listage des membres à proprement parlé est tout petit comparé à tout le code nécessaire pour générer le formulaire. C&#8217;est là que nous nous rendons compte finalement de l&#8217;utilité d&#8217;un tel logiciel. Bon, si vous êtes prêt, on y va !</p>
<h2>1 &#8211; Création du formulaire</h2>
<p>Lancer PrimalForms. <strong>Dans la partie gauche</strong> de la fenêtre se trouve les contrôles. Se sont les &#8220;objets&#8221; à placer sur le formulaire (champs de saisie, bouton, liste de choix &#8230;). <strong>Dans la partie du milieu</strong> se trouve le formulaire. C&#8217;est là que nous plaçons par glissé-déplacé les contrôles dont nous avons besoin. <strong>Dans la partie de droite</strong> se trouve les propriétés associées à chacun des contrôles et aussi de l&#8217;objet formulaire.</p>
<p>Nous allons avoir besoin des contrôles suivants : 1 label, 1 textBox, 1 button et 1 richTextBox.</p>
<p>Nous utiliserons le &#8220;<em>textBox</em>&#8221; pour saisir le nom du groupe dont on souhaite lister les membres, le &#8220;<em>button</em>&#8221; pour lancer le recherche et enfin le &#8220;<em>richTextBox</em>&#8221; pour afficher le résultat.</p>
<p>Placer les contrôles sur le formulaire afin d&#8217;obtenir quelque chose qui ressemble à ça (en mode création) :</p>
<p><span style="text-decoration: line-through"><strong><a href="http://syskb.com/wp-content/uploads/2010/03/buildForm.png"><img class="aligncenter size-medium wp-image-2902" src="http://syskb.com/wp-content/uploads/2010/03/buildForm-300x231.png" alt="buildForm 300x231 Mon premier script PoSh avec PrimalForms" width="300" height="231" title="buildForm 300x231 photo images" /></a></strong></span></p>
<p>Après avoir modifié les propriétés (dans la partie à droite de la fenêtre) de chacun des contrôles comme indiqué ci-dessous :</p>
<p>Pour &#8220;form1&#8243; :  <span style="text-decoration: underline"><strong>Text</strong></span> : <em>Et les membres sont &#8230;</em></p>
<p>Pour &#8220;button1&#8243; :  <span style="text-decoration: underline"><strong>Text</strong></span> : <em>Va chercher !</em></p>
<p>Pour &#8220;label1&#8243; :  <span style="text-decoration: underline"><strong>Text</strong></span> : <em>Nom du groupe</em></p>
<p>Pour &#8220;richTextBox1&#8243; :  <span style="text-decoration: underline"><strong>ScrollBars</strong></span> : <em>Vertical</em></p>
<p>Ceci étant fait, on enregistre notre boulot à l&#8217;aide du bouton <em><strong>SaveAs</strong></em>, pour sauvegarder notre projet, puis on clique sur <em><strong>Export PowerShell</strong></em> pour enregistrer le script que génère PrimalForms.</p>
<h2>2 &#8211; Ajout des actions</h2>
<p>Ouvrez<em> </em>le script généré par PrimalForms avec votre éditeur préféré.Vous devriez vous retrouver avec un script qui fait environ 125 ligne. Hé oui, quand même ! Y nous a bien aidé le PrimalForms !</p>
<p>Si on prend le temps de détailler un peu, on voit que le code n&#8217;est pas mal fait et ne contient rien de futile. On remarquera vers la ligne 29 le commentaire suivant :</p>
<p><span style="color: #339966">#TODO: Place custom script here</span></p>
<p>Oui, c&#8217;est bien là que nous allons placer notre bout de code à nous (bon, qu&#8217;on a pompé sur le Net&#8230;)</p>
<p>Donc on fait une petite recherche sur le Net &#8220;<em>powershell Listing local group members</em>&#8221; via Google et hop ! en 2ème position on trouve notre bonheur avec le bout de code suivant :</p>
<pre>$group =[ADSI]"WinNT://./Administrators"
$members = @($group.psbase.Invoke("Members"))
$members | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}</pre>
<p>Il ne nous reste plus qu&#8217;à l&#8217;adapter pour l&#8217;intégrer dans notre formulaire et déclencher l&#8217;action en fonction du groupe indiqué.</p>
<p>En regardant le code de notre formulaire, aux alentours des lignes 14 à 21, on peut noter le nom des variables objets utilisés. On voit que le champs de saisie du nom du groupe à pour nom de variable <span style="color: #ff00ff">$textBox1</span>. Il nous faut donc récupérer le contenu de cet objet pour provoquer la cherche l&#8217;aide de la propriété <span style="color: #ff00ff">.text</span> de cet objet. La première ligne du bout code que l&#8217;on va insérer va commencer comme ça :</p>
<pre>$GroupName = [string]$textBox1.text</pre>
<p>Quand on va cliquer sur &#8220;<strong>Va chercher !</strong>&#8221; <span style="color: #ff00ff">$GroupName</span> va prendre pour valeur le contenu de <span style="color: #ff00ff">$textBox1</span> converti en chaine de caractère grâce à <span style="color: #808080">[String]</span>.</p>
<p>Ensuite nous devons modifier la ligne du code &#8220;<span style="color: #0000ff"><em>$group =[ADSI]&#8220;WinNT://./Administrators&#8221;</em></span>&#8221; pour que &#8220;Administrators&#8221; soit remplacé par notre recherche à nous. On obtiendra une ligne de code comme suit :</p>
<pre>$group =[ADSI]"WinNT://./$GroupName"</pre>
<p>On a pas besoin de modifier la ligne<em> $members = @($group.psbase.Invoke(&#8220;Members&#8221;)) </em>on la laisse telle quelle.</p>
<p>Enfin, pour finir il faut que la sortie de notre code se fasse dans la zone prévue à cet effet, le <span style="color: #ff00ff">$richTextBox1</span>. On va donc modifier la dernière ligne du bout code qu&#8217;on a trouvé pour obtenir le résultat attendu comme suit (notez le petit &#8220;+`n&#8221; à la fin de ligne qui va gérer le retour chariot) :</p>
<pre>foreach ($mem in $members) {
$richTextBox1.text += $mem.GetType().InvokeMember("Name", 'GetProperty', $null, $mem, $null)+"`n"
}</pre>
<p>Au final on doit donc obtenir le code suivant :</p>
<pre>$GroupName = [string]$textBox1.text
$group =[ADSI]"WinNT://./$GroupName"
$members = @($group.psbase.Invoke("Members"))
foreach ($mem in $members) {
$richTextBox1.text += $mem.GetType().InvokeMember("Name", 'GetProperty', $null, $mem, $null)+"`n"
}</pre>
<p>Il ne nous reste plus qu&#8217;à le coller tout ça dans le code de notre formulaire (au niveau de la ligne 30 dans mon cas)</p>
<pre>29 | <span style="color: #339966">#TODO: Place custom script here</span>
30 |   <span style="color: #0000ff">LE CODE DOIT ÊTRE COLLE ICI</span>
31 | }</pre>
<p>On doit donc obtenir ça :</p>
<pre>29 | <span style="color: #339966">#TODO: Place custom script here</span>
30 | <span style="color: #0000ff">$GroupName = [string]$textBox1.text</span>
31 | <span style="color: #0000ff">$group =[ADSI]"WinNT://./$GroupName"</span>
32 | <span style="color: #0000ff">$members = @($group.psbase.Invoke("Members"))</span>
33 | <span style="color: #0000ff">foreach ($mem in $members) {</span>
34 |     <span style="color: #0000ff">$richTextBox1.text += $mem.GetType().InvokeMember("Name", 'GetProperty', $null, $mem, $null)+"`n"</span>
35 | <span style="color: #0000ff">}</span>
36 | }</pre>
<p>Enregistrez puis exécutez votre code comme vous en avez l&#8217;habitude. Si vous faites l&#8217;essai sur le groupe &#8220;<strong>Administrateurs</strong>&#8221; vous devriez, en principe, obtenir un résultat.</p>
<p>Si vous cliquez sur &#8220;Va chercher !&#8221; alors que le champs &#8220;Nom du groupe&#8221; est vide, il va nous générer une erreur &#8230; que nous devons, en bon scripteur, gérer.</p>
<pre><span style="color: #339966">#TODO: Place custom script here</span>
$GroupName = [string]$textBox1.text
If (!$GroupName) {$richTextBox1.text = "Le champs Nom du groupe ne peut être null"}
Else {
    $richTextBox1.text = ""
    $group =[ADSI]"WinNT://./$GroupName"
    $members = @($group.psbase.Invoke("Members"))
    foreach ($mem in $members) {
        $richTextBox1.text += $mem.GetType().InvokeMember("Name", 'GetProperty', $null, $mem, $null)+"`n"
    } # Fin du bloc ForEach
} # Fin du bloc Else
} # Fin de la procédure $button1_OnClick (TODO ...)</pre>
<h2>3 &#8211; Conclusion</h2>
<p>Bon, rien de vraiment compliqué pour qui est à l&#8217;aise avec le scripting. En fait, on arriverai presque à le comparer au HTA (en [beaucoup] mieux quand même !). Au début j&#8217;ai cherché un peu pour récupérer le contenu de ma variable $textBox1. Mais après je me suis sentie assez vite à l&#8217;aise. Reste plus qu&#8217;à trouver un équivalent à VBS2EXE pour avoir un semblant de &#8220;redistribuable&#8221;. Intéressant pour un gars comme moi qui doit proposer et développer des solutions &#8220;cadrés&#8221; d&#8217;industrialisation de processus &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/mon-premier-script-posh-avec-primalforms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un éditeur de Forms pour PowerShell</title>
		<link>http://syskb.com/un-editeur-de-forms-pour-powershell/</link>
		<comments>http://syskb.com/un-editeur-de-forms-pour-powershell/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 11:19:26 +0000</pubDate>
		<dc:creator>hatmos</dc:creator>
				<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=2876</guid>
		<description><![CDATA[En me promenant sur la toile, j&#8217;ai découverts via nos confrères &#8220;powershell-scripting.com&#8221; qu&#8217;il existe un éditeur de Forms à la sauce &#8220;Visual Basic&#8221; édité par SAPIEN Technologies. Pas mal fait, gratuit, il génère le code nécessaire pour obtenir un résultat plutôt bluffant. Dans la partie de gauche, choisissez puis positionnez vos contrôles sur le Form, [...]]]></description>
			<content:encoded><![CDATA[<p>En me promenant sur la toile, j&#8217;ai découverts via nos confrères &#8220;<em><a title="powershell-scripting.com" href="http://powershell-scripting.com" target="_blank">powershell-scripting.com</a></em>&#8221; qu&#8217;il existe un éditeur de Forms à la sauce &#8220;Visual Basic&#8221; édité par <a title="SAPIEN Technologies" href="http://www.sapien.com/default.asp" target="_blank"><em>SAPIEN Technologies</em></a>.</p>
<p>Pas mal fait, <strong>gratuit</strong>, il génère le code nécessaire pour obtenir un résultat plutôt bluffant.</p>
<p><span id="more-2876"></span>Dans la partie de gauche, choisissez puis positionnez vos contrôles sur le Form, adaptez les propriétés de chacun d&#8217;eux dans la partie de droite et enfin allez dans le menu &#8220;Export&#8221; pour enregistrer  le code généré. Éditez-le et placer votre code juste sous le commentaire &#8220;#TODO: Place custom script here&#8221;.</p>
<p>Dès que j&#8217;aurai l&#8217;occasion de m&#8217;en servir, j&#8217;en ferai un petit tutoriel.    (&#8211;&gt; <a title="PrimalForms (Comunity Edition)" href="http://blog.sapien.com/index.php/2008/11/03/free-primalforms-tool-for-powershell-released/" target="_blank">Télécharger PrimalForms C E</a> &lt;&#8211;)</p>
<p style="text-align: center"><a href="http://syskb.com/wp-content/uploads/2010/03/PrimalForms.jpg"><img class="aligncenter size-full wp-image-2877" src="http://syskb.com/wp-content/uploads/2010/03/PrimalForms.jpg" alt="PrimalForms Un éditeur de Forms pour PowerShell" width="645" height="423" title="PrimalForms photo images" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/un-editeur-de-forms-pour-powershell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Réinitialiser tous mes passwd dans mes forêts AD</title>
		<link>http://syskb.com/reinitialiser-tous-mes-passwd-dans-mes-forets-ad/</link>
		<comments>http://syskb.com/reinitialiser-tous-mes-passwd-dans-mes-forets-ad/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 16:48:58 +0000</pubDate>
		<dc:creator>OrDuCom1</dc:creator>
				<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=2854</guid>
		<description><![CDATA[Je suis un spécialiste AD pour un &#8216;grand compte&#8217; et j&#8217;ai 10 comptes différents pour me connecter  (3 forêts composées chacune de 3 domaines + un compte standard = 10 comptes) ! La gestion de mes mots de passe devenant un &#8220;chouillat&#8221; compliquée (toujours à cause de ma mémoire de poisson rouge) je me suis [...]]]></description>
			<content:encoded><![CDATA[<p>Je suis un spécialiste AD pour un &#8216;grand compte&#8217; et j&#8217;ai 10 comptes différents pour me connecter  (3 forêts composées chacune de 3 domaines + un compte standard = 10 comptes) !</p>
<p>La gestion de mes mots de passe devenant un &#8220;chouillat&#8221; compliquée (toujours à cause de ma mémoire de poisson rouge) je me suis fait un petit script VBS qui me change mon mot de passe en un coup sur tous les domaines des fôrets AD.</p>
<p><span id="more-2854"></span>Seul pré-requis : le mot de passe doit être (et sera) le même sur tous les environnements pour que le script accepte de s&#8217;exécuter.</p>
<p>Le fonctionnement est simple. J&#8217;utilise mon compte au format &#8220;domaine\utilisateur&#8221; avec l&#8217;<em>ancien</em> mot de passe pour effectuer une connexion sur l&#8217;AD cible, puis j&#8217;affecte mon nouveau mot de passe à mon objet utilisateur. Le script s&#8217;appuie sur un fichier de configuration (à enregistrer dans &#8220;C:\ChangeMDP\ListAccount.txt&#8221;) construit de la façon suivante :</p>
<pre>## ======================================================================================
##
#### RAPPEL : TOUS LES MDP DOIVENT AU PRÉALABLE ÊTRE UNIFORME ET DÉJÀ LES MÊMES
##
## ======================================================================================
## DOMAINE DE RECETTE
@_IP_DC_CIBLE;domain\login_adm;distiguishedName du compte dont on doit changer le mdp
## DOMAINE D'HOLOGATION
@_IP_DC_CIBLE;domain\login_adm;distiguishedName du compte dont on doit changer le mdp
........ etc .......
## ======================================================================================
</pre>
<p>Après avoir paramétré ce fichier, le script sera à même de changer vos mots de passe en un clique <img src='http://syskb.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' title="icon wink photo images" /> </p>
<p><a title="Télécharger le ZIP" href="http://syskb.com/wp-content/uploads/2010/03/ChangePwd.zip" target="_self"><img class="alignleft size-thumbnail wp-image-2861" src="http://syskb.com/wp-content/uploads/2010/03/cp_changepwd-137x150.jpg" alt="cp changepwd 137x150 Réinitialiser tous mes passwd dans mes forêts AD" width="137" height="150" title="cp changepwd 137x150 photo images" /></a></p>
<p>.</p>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/reinitialiser-tous-mes-passwd-dans-mes-forets-ad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Créer une tâche “AT” (les doigts dans le nez)</title>
		<link>http://syskb.com/creer-une-tache-at-les-doigts-dans-le-nez/</link>
		<comments>http://syskb.com/creer-une-tache-at-les-doigts-dans-le-nez/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 13:43:13 +0000</pubDate>
		<dc:creator>hatmos</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Windows Server 2003]]></category>
		<category><![CDATA[Windows Server 2008]]></category>
		<category><![CDATA[Windows Vista]]></category>
		<category><![CDATA[Windows XP]]></category>
		<category><![CDATA[HTA]]></category>
		<category><![CDATA[Tâches AT]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=2827</guid>
		<description><![CDATA[On le sait, créer une tâche AT n&#8217;est pas toujours simple et les réfractaires à la ligne de commande en savent quelque chose. Je n&#8217;en paramètre pas tout les jours et pour moi (j&#8217;ai une mémoire de poisson rouge) c&#8217;est la syntaxe que j&#8217;oublie, surtout l&#8217;abréviation les jours de la semaine en anglais &#8230; J&#8217;ai [...]]]></description>
			<content:encoded><![CDATA[<p>On le sait, créer une tâche AT n&#8217;est pas toujours simple et les réfractaires à la ligne de commande en savent quelque chose. Je n&#8217;en paramètre pas tout les jours et pour moi (j&#8217;ai une mémoire de poisson rouge) c&#8217;est la syntaxe que j&#8217;oublie, surtout l&#8217;abréviation les jours de la semaine en anglais &#8230;</p>
<p><span id="more-2827"></span>J&#8217;ai donc développé un petit script VBS en avec une interface graphique en HTA pour me faciliter le travail &#8230; (testé sur des serveurs Win 2003 anglais)</p>
<p><a href="http://syskb.com/wp-content/uploads/2010/03/AT_Task_Creator.zip" target="_blank">Télécharger le fichier</a></p>
<p><a href="http://syskb.com/wp-content/uploads/2010/03/GUI_AT.jpg"><img class="size-thumbnail wp-image-2833 alignnone" src="http://syskb.com/wp-content/uploads/2010/03/GUI_AT-92x150.jpg" alt="GUI AT 92x150 Créer une tâche “AT” (les doigts dans le nez)" width="92" height="150" title="GUI AT 92x150 photo images" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/creer-une-tache-at-les-doigts-dans-le-nez/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment actualiser une GPO à distance</title>
		<link>http://syskb.com/actualiser-une-gpo-a-distance/</link>
		<comments>http://syskb.com/actualiser-une-gpo-a-distance/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 21:06:23 +0000</pubDate>
		<dc:creator>hatmos</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Windows Server 2003]]></category>
		<category><![CDATA[Windows Server 2008]]></category>
		<category><![CDATA[Windows Vista]]></category>
		<category><![CDATA[Windows XP]]></category>
		<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[GPO]]></category>
		<category><![CDATA[Remote]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=2683</guid>
		<description><![CDATA[Lorsque l&#8217;on souhaite actualiser la stratégie de groupe appliquée à une machine il suffit d&#8217;exécuter la commande gpupdate /force depuis une invite de commande de la machine. La tâche n&#8217;est malheureusement pas aussi simple lorsqu&#8217;il s&#8217;agit d&#8217;actualiser les stratégies de groupe sur une ou plusieurs machines distantes. Tous les administrateurs qui manipulent des GPO ont [...]]]></description>
			<content:encoded><![CDATA[<p>Lorsque l&#8217;on souhaite actualiser la stratégie de groupe appliquée à une machine il suffit d&#8217;exécuter la commande gpupdate /force depuis une invite de commande de la machine. La tâche n&#8217;est malheureusement pas aussi simple lorsqu&#8217;il s&#8217;agit d&#8217;actualiser les stratégies de groupe sur une ou plusieurs machines distantes.</p>
<p><span id="more-2683"></span></p>
<p>Tous les administrateurs qui manipulent des GPO ont été confrontés à cette problématique. Ils viennent de faire une modification importante et souhaitent qu&#8217;elle soit aussitôt prise en compte par l&#8217;ensemble des clients connectés plutôt que d&#8217;attendre le délai de rafraîchissement de la GPO qui peut varier de 90 à 120mn selon le paramétrage.</p>
<p>C&#8217;est en me baladant sur le très bon site <a title="GPOGUY.COM" href="http://www.gpoguy.com">GPOGuys.com</a> que j&#8217;ai découvert l&#8217;outil <a title="Command-line Remote GPO Refresh" href="http://www.gpoguy.com/FreeTools/FreeToolsLibrary/tabid/67/agentType/View/PropertyID/83/Default.aspx">Command-line Remote GPO Refresh</a>, un outil en ligne de commande qui permet d&#8217;actualiser les stratégies de groupe sur une machine distante.</p>
<p>Côté utilisation c&#8217;est très simple, une fois que vous avez téléchargé l&#8217;archive et extrait l&#8217;exécutable <em>Rgprefresh.exe</em>, lancez le depuis une invite de commande avec les paramètres adéquat.</p>
<p>Ainsi pour afficher tous les paramètres disponible tapez :</p>
<pre>Rgprefresh.exe /?</pre>
<p>Pour forcer la mise à jour des stratégies sur une machine distante tapez:</p>
<pre>Rgprefresh.exe /m:COMPUTERNAME /n /force</pre>
<p>Pour forcer la mise à jour des stratégies utilisateurs sur une machine distante tapez:</p>
<pre>Rgprefresh.exe /m:COMPUTERNAME /t:User /n /force</pre>
<p>Dans les 2 exemples précédents nous avons forcé la mise à jour des stratégies sur 1 machine distante. Pour le faire sur plusieurs machines nous utiliserons les providentielles commandes MSDOS DO et FOR.</p>
<p>Pour forcer la mise à jour des stratégies sur une liste de machines dans un fichier liste.txt:</p>
<pre><code>FOR /F %i in (c:\liste.txt) DO Rgprefresh.exe /m:%i /n /force</code></pre>
<p>Pour forcer la mise à jour des stratégies sur toutes les machines de la plage IP 192.168.0.100 à 192.168.0.200 :</p>
<pre><code>FOR /L %i in (100,1,200) DO Rgprefresh.exe /m:192.168.0.%i /n /force</code></pre>
<p>Ce n&#8217;est pas plus compliqué et j&#8217;espère que cette astuces vous sera utile.</p>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/actualiser-une-gpo-a-distance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Changer le mot de passe du compte administrateur local</title>
		<link>http://syskb.com/changer-le-mot-de-passe-du-compte-administrateur-local/</link>
		<comments>http://syskb.com/changer-le-mot-de-passe-du-compte-administrateur-local/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 17:37:53 +0000</pubDate>
		<dc:creator>hatmos</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Tutoriel]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=2648</guid>
		<description><![CDATA[Ce script permet de réinitialiser le mot de passe du compte administrateur local d&#8217;un ordinateur. Il suffit alors de le déployer à l&#8217;aide d&#8217;une GPO ou par un logonscript pour réinitialiser massivement les mots de passe de l&#8217;ensemble des comptes administrateurs locaux d&#8217;un domaine. Set oShell = CreateObject("WScript.Shell") Const SUCCESS = 0 sUser = "Administrateur" [...]]]></description>
			<content:encoded><![CDATA[<p>Ce script permet de réinitialiser le mot de passe du compte administrateur local d&#8217;un ordinateur. Il suffit alors de le déployer à l&#8217;aide d&#8217;une <em>GPO </em>ou par un <em>logonscript </em>pour réinitialiser massivement les mots de passe de l&#8217;ensemble des comptes administrateurs locaux d&#8217;un domaine.<br />
<span id="more-2648"></span></p>
<pre>Set oShell = CreateObject("WScript.Shell")
Const SUCCESS = 0
sUser = "Administrateur"
sPwd = "NouveauMotDePasse"
Set oWshNet = CreateObject("WScript.Network")
sComputerName = oWshNet.ComputerName
Set oUser = GetObject("WinNT://" &amp; sComputerName &amp; "/" &amp; sUser)
oUser.SetPassword sPwd
oUser.Setinfo
oShell.LogEvent SUCCESS, "Mot de passe du compte administrateur local changé"
</pre>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/changer-le-mot-de-passe-du-compte-administrateur-local/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ajouter un groupe de domaine dans le groupe administrateur local</title>
		<link>http://syskb.com/ajouter-un-groupe-de-domaine-dans-le-groupe-administrateur-local/</link>
		<comments>http://syskb.com/ajouter-un-groupe-de-domaine-dans-le-groupe-administrateur-local/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 17:10:56 +0000</pubDate>
		<dc:creator>hatmos</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[Administration]]></category>
		<category><![CDATA[VBScript]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=2642</guid>
		<description><![CDATA[Lorsqu&#8217;un ordinateur est intégré dans un domaine Active Directory, le groupe Domain Admins devient automatiquement membre du groupe Administrateurs local de l&#8217;ordinateur. Ainsi les administrateurs du domaine ont un accès complet à tous ces membres. Mais dans les entreprises l&#8217;administration des ordinateurs d&#8217;un domaine est confiée à des techniciens qui ne sont pas toujours administrateurs [...]]]></description>
			<content:encoded><![CDATA[<p>Lorsqu&#8217;un ordinateur est intégré dans un domaine Active Directory, le groupe <em>Domain Admins</em> devient automatiquement membre du groupe <em>Administrateurs </em>local de l&#8217;ordinateur. Ainsi les administrateurs du domaine ont un accès complet à tous ces membres.</p>
<p><span id="more-2642"></span>Mais dans les entreprises l&#8217;administration des ordinateurs d&#8217;un domaine est confiée à des techniciens qui ne sont pas toujours administrateurs du domaine. Il est donc nécessaire d&#8217;ajouter le groupe dédié aux techniciens dans le groupe <em>Administrateurs </em>local de l&#8217;ordinateur. La solution la plus courante pour effectuer ce type d&#8217;opération consiste à utiliser un <em>VBScript </em>qui sera exécuté via un <em>Logonscript </em>ou une <em>GPO</em>.</p>
<p>Le script suivant permet d&#8217;ajouter un groupe d&#8217;un domaine Active Directory dans le groupe Administrateurs local de la machine qui l&#8217;exécute:</p>
<pre>option Explicit
Dim objGroup
Dim strComputer
On Error Resume Next
strComputer = "."
Set objGroup = GetObject("WinNT://" &amp; strComputer &amp;  "/Administrateurs,group")
objGroup.add("WinNT://DOMAINE/NOMDUGROUPE,group")
Set objGroup = Nothing</pre>
<p>Remplacez <em>DOMAINE </em>par le nom de votre Domaine et <em>NOMDUGROUPE </em>par le nom du groupe <em>PRE Windows 2000</em> du groupe à ajouter.</p>
<p>Vous pouvez ensuite lancer ce script via une GPO ou l&#8217;intégrer au script d&#8217;ouverture de session de vos stations.</p>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/ajouter-un-groupe-de-domaine-dans-le-groupe-administrateur-local/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Créer une tâche planifiée sur un serveur distant</title>
		<link>http://syskb.com/creer-une-tache-planifiee-sur-un-serveur-distant/</link>
		<comments>http://syskb.com/creer-une-tache-planifiee-sur-un-serveur-distant/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 20:57:05 +0000</pubDate>
		<dc:creator>hatmos</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Windows Server 2003]]></category>
		<category><![CDATA[Windows Server 2008]]></category>
		<category><![CDATA[Planificateur]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=2579</guid>
		<description><![CDATA[J&#8217;ai eu besoin récemment de créer 1 tâche planifiée sur 100 serveurs Windows. J&#8217;avais alors 2 solutions : Me connecter sur chaque serveur en terminal serveur et répéter 100 fois la même opération ou trouver une solution pour créer à distance la tâche planifiée sur les 100 serveurs à la fois. Une petite recherche et [...]]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai eu besoin récemment de créer 1 tâche planifiée sur 100 serveurs Windows. J&#8217;avais alors 2 solutions : Me connecter sur chaque serveur en terminal serveur et répéter 100 fois la même opération ou trouver une solution pour créer à distance la tâche planifiée sur les 100 serveurs à la fois. Une petite recherche et la solution était toute trouvée &#8230;</p>
<p><span id="more-2579"></span></p>
<h3>Créer une tâche planifiée à distance</h3>
<p>Inutile de chercher bien loin puisque le planificateur de tâche intégré à Windows <em>schtasks.exe</em> peut s&#8217;utiliser en ligne de commande avec une multitude de paramètres dont certains sont dédiés à la création de tâches à distance.</p>
<p>Pour utiliser <em>schtasks.exe</em> ouvrez une invite de commande (Presser <em>WIN + R </em>et tapez <em>cmd</em>).</p>
<p>Vous pouvez ensuite afficher l&#8217;aide sur la création de tâches avec <em>schtasks.exe</em></p>
<pre>schtasks.exe /create /?</pre>
<p>Pour créer une tâche sur un serveur distant</p>
<pre>schtasks.exe /create /S Nom_du_serveur /U domaine\utilisateur /P mot_de_passe  /SC fréquence /TR Fichier_de_commandes</pre>
<h3>Automatiser la création d&#8217;une tâche planifiée sur plusieurs serveurs</h3>
<p>Maintenant que l&#8217;on sait comment créer une tâche planifiée à distance il est assez simple de répéter l&#8217;opération sur plusieurs systèmes distants, toujours depuis une invite de commande, et ceux grâce aux commandes FOR, IN et DO.</p>
<p>Dans l&#8217;exemple qui suit je vais créer une même tâche planifiée sur tous les serveurs contenu dans un fichier<em> list.txt</em>.</p>
<pre>FOR /F %1 IN (list.txt) DO schtasks.exe /create /S %1 /U domaine\utilisateur /P mot_de_passe  /SC fréquence /TR Fichier_de_commandes</pre>
<p>Comme vous pouvez le constater en une seule ligne de script je peux créer une tâche planifiée sur autant de serveur que je souhaite, 10, 20, 100, 1000 &#8230;</p>
<p>Dans ce 2ème exemple je créé une tâche planifiée sur tous les serveurs contenu dans la plage IP 192.168.0.25 à 192.168.0.125. La valeur située entre le 25 et le 125 définit le pas à suivre (25, 26, 27, &#8230; , 125)</p>
<pre>FOR /L %i IN (25,1,125) DO schtasks.exe /create /S<code> 192.168.0.</code>%1 /U domaine\utilisateur /P mot_de_passe  /SC fréquence /TR Fichier_de_commandes</pre>
<h3>Pour conclure</h3>
<p>Faire 100 fois la même opération peut vite s&#8217;avérer ennuyeux et chronophage. Chercher une solution, la tester et la mettre en œuvre m&#8217;a pris à peine 30mn. Même si je sais que certains commerciaux n&#8217;hésiteraient pas à facturer une 1/2 journée de prestation à un client, il était hors de question pour ma santé mentale que je passe autant de temps. Rappelez-vous un bon administrateur est un administrateur fainéant !</p>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/creer-une-tache-planifiee-sur-un-serveur-distant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Une macro pour supprimer / localiser les doublons dans un classeur Excel</title>
		<link>http://syskb.com/une-macro-pour-supprimer-localiser-les-doublons-dans-un-classeur-excel/</link>
		<comments>http://syskb.com/une-macro-pour-supprimer-localiser-les-doublons-dans-un-classeur-excel/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 10:56:47 +0000</pubDate>
		<dc:creator>hatmos</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[Macro]]></category>
		<category><![CDATA[Remove Duplicate]]></category>
		<category><![CDATA[VBA]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=2212</guid>
		<description><![CDATA[Je vous propose une petite macro pour supprimer les doublons dans un classeur Excel. Une petite variante de cette macro permettra au contraire de ne conserver QUE les doublons. Dans cette exemple des lignes seront considérées comme des doublons si les valeurs des colonnes 1 ET 2 sont identiques. Ces 2 valeurs sont représentées dans [...]]]></description>
			<content:encoded><![CDATA[<p>Je vous propose une petite macro pour supprimer les doublons dans un classeur Excel. Une petite variante de cette macro permettra au contraire de ne conserver QUE les doublons.</p>
<p><span id="more-2212"></span></p>
<p>Dans cette exemple des lignes seront considérées comme des doublons si les valeurs des colonnes 1 ET 2 sont identiques. Ces 2 valeurs sont représentées dans le script par les variables <em>word1 </em>et <em>word2</em>.  A la fin du script les lignes dupliquées sont tout simplement supprimées.</p>
<pre>Sub RemoveDuplicate()

Sheets(1).UsedRange.EntireRow.Sort Key1:=Range("A1"), Key2:=Range("B1")

i = 1: j = 1
Sheets(1).Select
While Cells(i, 1).Value &lt;&gt; ""
 word1 = Cells(i, 1).Value
 word2 = Cells(i, 2).Value

 j = i + 1
 If Cells(i, 2).Value &lt;&gt; "ERASE" Then
 While Cells(j, 1).Value &lt;&gt; ""
 If Cells(j, 1).Value = word1 And Cells(j, 2).Value = word2 Then
 Cells(j, 3).Value = "ERASE"
 End If
 j = j + 1
 Wend
 End If
i = i + 1
Wend

For j = i To 1 Step -1
 If Cells(j, 3).Value = "ERASE" Then
 Rows(j).Select
 Selection.Delete Shift:=xlUp
 End If
Next j

End Sub</pre>
<p>Dans ce deuxième exemple seule la valeur de la colonne 1 de chaque ligne sera utilisée comme condition. Par contre à la fin du script, contrairement à l&#8217;exemple précédent, seules les doublons seront conservés !</p>
<pre>Sub RemoveDuplicate()

Sheets(1).UsedRange.EntireRow.Sort Key1:=Range("A1"), Key2:=Range("B1")

i = 1: j = 1
Sheets(1).Select
While Cells(i, 1).Value &lt;&gt; ""
 word1 = Cells(i, 1).Value

 j = i + 1
 If Cells(i, 2).Value &lt;&gt; "ERASE" Then
 While Cells(j, 1).Value &lt;&gt; ""
 If Cells(j, 1).Value = word1 Then
 Cells(j, 2).Value = "ERASE"
 End If
 j = j + 1
 Wend
 End If
i = i + 1
Wend

For j = i To 1 Step -1
 If Cells(j, 2).Value &lt;&gt; "ERASE" Then
 Rows(j).Select
 Selection.Delete Shift:=xlUp
 End If
Next j

End Sub</pre>
<p>Maintenant à vous de composer selon votre besoin, j&#8217;espère dans tous les cas que ces petites macros vous feront gagner beaucoup de temps !</p>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/une-macro-pour-supprimer-localiser-les-doublons-dans-un-classeur-excel/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Exécuter un programme sur un système distant</title>
		<link>http://syskb.com/executer-un-programme-sur-un-systeme-distant/</link>
		<comments>http://syskb.com/executer-un-programme-sur-un-systeme-distant/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 15:11:40 +0000</pubDate>
		<dc:creator>hatmos</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Windows Server 2003]]></category>
		<category><![CDATA[Windows Server 2008]]></category>
		<category><![CDATA[Windows Vista]]></category>
		<category><![CDATA[Windows XP]]></category>
		<category><![CDATA[Administration]]></category>
		<category><![CDATA[batches]]></category>
		<category><![CDATA[Contrôle à distance]]></category>
		<category><![CDATA[run as]]></category>
		<category><![CDATA[Script]]></category>

		<guid isPermaLink="false">http://syskb.com/?p=1976</guid>
		<description><![CDATA[Lorsqu&#8217;il s&#8217;agit d&#8217;exécuter un programme ou un script sur un serveur distant on peut toujours le faire en se connectant dessus en Terminal Server, Dameware Remote Control, PC Anywhere ou autre outil de prise de main à distance. Cette solution convient parfaitement pour des actions ponctuelle mais s&#8217;avère beaucoup plus contraignante lorsque l&#8217;on doit exécuter [...]]]></description>
			<content:encoded><![CDATA[<p>Lorsqu&#8217;il s&#8217;agit d&#8217;exécuter un programme ou un script sur un serveur distant on peut toujours le faire en se connectant dessus en Terminal Server, Dameware Remote Control, PC Anywhere ou autre <a href="http://syskb.com/question-ouverte-quel-est-le-meilleur-logiciel-de-prise-en-main-a-distance/">outil de prise de main à distance</a>. Cette solution convient parfaitement pour des actions ponctuelle mais s&#8217;avère beaucoup plus contraignante lorsque l&#8217;on doit exécuter le même programme sur plusieurs serveurs ! Heureusement il existe PsExec &#8230;</p>
<p><span id="more-1976"></span></p>
<p>PsExec est un outil en ligne de commande fournit dans la suite <a href="http://syskb.com/pstools/">PsTools </a>de chez Sysinternals. Il permet d&#8217;exécuter à distance des commandes, des programmes, des batches, comme si vous étiez connecté sur le serveur distant. Cet outil est très prisé des administrateurs pour son efficacité et parce qu&#8217;il permet d&#8217;économiser beaucoup de temps &#8230; surtout lorsqu&#8217;il s&#8217;agit d&#8217;effectuer des tâches rébarbatives.</p>
<h3>Installation et utilisation</h3>
<p>Côté installation c&#8217;est très simple. Téléchargez la suite <a title="Download PSTOOLS" href="http://syskb.com/pstools/">PsTools </a>et placez <strong>psexec.exe </strong>par exemple dans le C:\ de votre station d&#8217;administration ou d&#8217;un serveur.</p>
<p>Ouvrez ensuite une invite de commande et tapez <strong>psexec.exe /?</strong> pour afficher les options disponibles.</p>
<h3>Voici maintenant quelques exemples d&#8217;utilisation de PsExec</h3>
<ul>
<li>Pour copier puis pour éxécuter le programme <strong>hotfix.exe </strong>un serveur</li>
</ul>
<pre>psexec \\server1 -c hotfix.exe</pre>
<ul>
<li>Pour arrêter le service <strong>spooler</strong> sur le serveur distant <strong>\\SERVER2</strong></li>
</ul>
<pre>psexec \\server2 net stop spooler</pre>
<ul>
<li>Pour lancer <strong>Internet Explorer</strong> sur votre machine locale avec des droits limités:</li>
</ul>
<pre>psexec -l -d "c:\program files\internet explorer\iexplore.exe"</pre>
<ul>
<li>Pour lancer un programme sur plusieurs serveurs à la fois</li>
</ul>
<p>Pour lancer un programme sur plusieurs serveurs distants à la fois il faut tout d&#8217;abord créer un référentiel des serveurs sur lesquels seront exécutés le programme. Pour cela je créé simplement un fichier <strong>list.txt </strong>contenant un serveur par ligne.</p>
<blockquote><p>SRV01<br />
SRV02<br />
SRV03<br />
SRV04</p></blockquote>
<p>Il faut ensuite créer un fichier batch qui balayera le fichier list.txt et exécutera la commande désirée pour chacun des serveurs référencés. J&#8217;ajoute le code suivant dans un fichier nommé <strong>RemoteStopSpooler.bat </strong></p>
<pre><code>for /F %%1 IN (list.txt) do psexec.exe \\%%1 net stop spooler</code></pre>
<p>Il suffit de lancer <strong>RemoteStopSpooler.bat </strong>pour arrêter le service d&#8217;impression sur les serveurs SRV01 à SRV04. Et la j&#8217;ai vraiment gagner du temps !</p>
]]></content:encoded>
			<wfw:commentRss>http://syskb.com/executer-un-programme-sur-un-systeme-distant/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
