 <?xml-stylesheet type="text/css" href="http://www.silogix.fr/Data/style/rss1.css" ?> <?xml-stylesheet type="text/xsl" href="http://www.silogix.fr/Data/style/rss1.xsl" ?>
<rss version="2.0">
  <channel>
    <title>Blog</title>
    <link>http://www.silogix.fr/Blog-Silogix/blog.aspx</link>
    <description />
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>mojoPortal Blog Module</generator>
    <ttl>120</ttl>
    <item>
      <title>Gérer les "Alternate Data Streams" avec PowerShell 2 et PowerShell 3</title>
      <description><![CDATA[<p> </p>
<p>ADS pour <em>Alternate Data Streams </em>est une fonctionnalité du système de fichier NTFS qui permet d'associer plus d'un flux de données à un nom de fichier en jouant sur le format de ce dernier  : "Nom_De_Fichier:Nom_De_Flux_Particulier" (Ex : Fic.txt:Zone.Identifier).</p>
<p>Les flux de données alternatifs n'apparaissent pas dans Windows Explorer, et leur taille n'est pas comprise dans la taille du fichier qui les héberge. Seul le flux principal d'un fichier est conservé au moment de la copie sur un système de fichier de type FAT, de l'attachement à un courrier ou du téléchargement sur un site WEB. Ceci explique le fait que les ADS ne sont pas utilisés pour le stockage de données critiques.</p>
<p>Les flux de données alternatifs ont étés créés pour les '<em>ressources forks</em>' dans le produit '<em>Service for Macintosh</em>' (SFM). Depuis des virus ont utilisés les ADS pour cacher leur code, mais aussi des lecteurs multimédias pour stocker les formats des fichiers de données (container MPEG ou OGG). Plus récemment des données ADS ont aussi été ajoutées par Internet Explorer (mais aussi d'autres browser) pour marquer les fichiers provenant de sources incertaines (téléchargement), donc peu sures pour être exécutées localement.</p>
<p style="text-align: center;"><img title="Attributs étendus sous NTFS" src="http://www.silogix.fr/Data/Sites/1/imgOutils/2012-05-09-alternative-data-streams/attributs-etendus-sous-ntfs.png" alt="Attributs étendus sous NTFS" width="550" height="420" /></p>
<p>Historiquement il est possible d'accéder aux flux alternatifs à travers les commandes <strong><kbd>dir</kbd></strong>, <strong><kbd>echo</kbd></strong> et <strong><kbd>more</kbd></strong> associés aux opérateurs de redirection <strong><kbd>&gt;</kbd></strong> et <strong><kbd>&lt;</kbd></strong> de l'interpréteur de comande <strong><kbd>CMD.EXE</kbd></strong></p>
<h4>Accès aux Alternate Data Stream avec CMD.EXE :</h4>
<h5 style="padding-left: 30px;">Détecter la présence d'ADS avec la commande <strong><kbd>dir</kbd></strong> :</h5>
<pre style="font-size: 10pt; font-family: Consolas,'Lucida Console','DejaVu Sans Mono',monospace; width: 100%; color: white; overflow: visible; direction: ltr; text-align: left; line-height: 14pt; background-color: #000000; border-style: none; margin: 0; padding: 5px;">C:\Temp\ADSTest&gt;dir /r
 Le volume dans le lecteur C n'a pas de nom.
 Le numéro de série du volume est 96B0-0597

 Répertoire de C:\Temp\ADSTest

09/05/2012  09:09              .
09/05/2012  09:09              ..
07/05/2012  09:25           495 616 SetupSlxWOL.msi
                                 <span style="color: red;">26 SetupSlxWOL.msi:Zone.Identifier:$DATA</span>
               1 fichier(s)          495 616 octets
               2 Rép(s)  40 051 462 144 octets libres</pre>
<p> </p>
<h5 style="padding-left: 30px;">Visualiser les données d'un flux alternatif avec la commande <span style="font-family: Courier New;">more</span> et l'opérateur <span style="font-family: Courier New;">&lt;</span> :</h5>
<pre style="font-size: 10pt; font-family: Consolas,'Lucida Console','DejaVu Sans Mono',monospace; width: 100%; color: white; overflow: visible; direction: ltr; text-align: left; line-height: 14pt; background-color: #000000; border-style: none; margin: 0; padding: 5px;">C:\Temp\ADSTest&gt;more &lt; SetupSlxWOL.msi:Zone.Identifier
<span style="color: red;">[ZoneTransfer]</span>
<span style="color: red;">ZoneId=3</span></pre>
<p> </p>
<h5 style="padding-left: 30px;">Modifier les données d'un flux alternatif avec la commande <span style="font-family: Courier New;">echo</span> et l'opérateur <span style="font-family: Courier New;">&gt;</span> :</h5>
<pre style="font-size: 10pt; font-family: Consolas,'Lucida Console','DejaVu Sans Mono',monospace; width: 100%; color: white; overflow: visible; direction: ltr; text-align: left; line-height: 14pt; background-color: #000000; border-style: none; margin: 0; padding: 5px;">C:\Temp\ADSTest&gt;echo ""&gt;SetupSlxWOL.msi:Zone.Identifier</pre>
<p> </p>
<h5 style="padding-left: 30px;">Les opérations précédentes ont conduit à la supression de l'information de zone</h5>
<p style="text-align: center;"><img title="Alternative Data Streams suppression des informations de zone " src="http://www.silogix.fr/Data/Sites/1/imgOutils/2012-05-09-alternative-data-streams/suppresion-information-de-zone.png" alt="Alternative Data Streams suppression des informations de zone " width="550" height="283" /></p>
<h4 style="text-align: left;">Outil en ligne de commande</h4>
<p style="text-align: left;"> Il existe sur le site de Microsoft (Sysinternals) l'outil <a title="Outils Stream.EXE de Sysinternals (Microsoft)" href="http://technet.microsoft.com/en-us/sysinternals/bb897440" target="_blank">STREAM.EXE</a> qui permet de rechercher et de supprimer de façon récursive les flux de données alternatifs. C'est un moyen efficace de débloquer par script des fichiers provenant d'une zone internet à laquelle on ne faisait pas confiance.</p>
<pre style="font-size: 10pt; font-family: Consolas,'Lucida Console','DejaVu Sans Mono',monospace; width: 100%; color: white; overflow: visible; direction: ltr; text-align: left; line-height: 14pt; background-color: #000000; border-style: none; margin: 0; padding: 5px;">C:\Temp\ADSTest&gt;streams

Streams v1.56 - Enumerate alternate NTFS data streams
Copyright (C) 1999-2007 Mark Russinovich
Sysinternals - www.sysinternals.com

usage: streams [-s] [-d] 
-s     Recurse subdirectories
-d     Delete streams</pre>
<h4 style="text-align: left;"> </h4>
<h4 style="text-align: left;">PowerShell 2.0</h4>
<p style="text-align: left;">Aucune des applets de commande de base de PowerShell ne permet de manipuler en direct les flux de données alternatif. La raison est que ces derniers ne sont pas exposés par les classes de base du Framework .NET. Le script suivant exploite l'appel à l'interpréteur de commande CMD.EXE à travers PowerShell 2 pour positionner les lire les ADS. </p>
<pre class="csharpcode"><code><span class="rem"># AlternateDataStream.ps1</span><br /><br /><span class="rem"># Blocks de scripts appelant CMD.EXE</span><br />$scriptBlockSetStream = {cmd /C `<span class="str">"echo $($Args[0])`&gt;$($Args[1]):$($Args[2])`"</span>}<br />$scriptBlockGetStream = {cmd /C `<span class="str">"more `&lt;$($Args[0]):$($Args[1])`"</span>}<br /><br />$streamName = <span class="str">"NativeFilePath"</span><br />$File = <span class="str">"C:\Temp\ADSTest\toto.txt"</span><br />$streamContent = Split-Path -Path $File -Parent<br /><br /><span class="rem"># Positionnement d'un Alternate Data Stream</span><br />Invoke-Command -ScriptBlock $scriptBlockSetStream -ArgumentList $streamContent,$File,$streamName<br /><span class="rem"># Récupération d'un Alternate Data Stream</span><br />$res = Invoke-Command -ScriptBlock $scriptBlockGetStream -ArgumentList $File,$streamName<br />$res</code></pre>
<p>Il est possible d'atteindre l'API WIN32 CreateFile qui permet de manipuler les ADS à travers la couche 'interop' du Framework .NET.   </p>
<h4>PowerShell 3</h4>
<p>En PowerShell 3 une série d'applet de commandes prennent en charge les flux de données alternatif</p>
<pre style="font-size: 10pt; font-family: 'Courier New',Courier,'Nimbus Mono L',monospace; width: 100%; color: white; overflow: visible; direction: ltr; text-align: left; line-height: 14pt; background-color: #000080; border-style: none; margin: 0; padding: 5px;">PS C:\&gt; Get-Command -ParameterName Stream  -Module Microsoft.PowerShell.Management

Capability      Name                             ModuleName
----------      ----                             ----------
Cmdlet          Add-Content                      Microsoft.PowerShell.Management
Cmdlet          Clear-Content                    Microsoft.PowerShell.Management
Cmdlet          Get-Content                      Microsoft.PowerShell.Management
Cmdlet          Get-Item                         Microsoft.PowerShell.Management
Cmdlet          Remove-Item                      Microsoft.PowerShell.Management
Cmdlet          Set-Content                      Microsoft.PowerShell.Management</pre>
<p> </p>
<h5 style="padding-left: 30px;">Lister les flux d'un fichier</h5>
<pre style="font-size: 10pt; font-family: 'Courier New',Courier,'Nimbus Mono L',monospace; width: 100%; color: white; overflow: visible; direction: ltr; text-align: left; line-height: 14pt; background-color: #000080; border-style: none; margin: 0; padding: 5px;">PS C:&gt; Get-Item .\SetupSlxWOL.msi -Stream *


   FileName: C:\Temp\ADSTest\SetupSlxWOL.msi

Stream                   Length
------                   ------
:$DATA                   496640</pre>
<p> </p>
<h5 style="padding-left: 30px;">Positionner un flux alternatif sur un fichier</h5>
<pre style="font-size: 10pt; font-family: 'Courier New',Courier,'Nimbus Mono L',monospace; width: 100%; color: white; overflow: visible; direction: ltr; text-align: left; line-height: 14pt; background-color: #000080; border-style: none; margin: 0; padding: 5px;">PS C:\&gt; Set-Content .\SetupSlxWOL.msi -Stream "Zone.Identifier" -Value "[ZoneTransfer]","ZoneId=3"
PS C:\&gt; Get-Item .\SetupSlxWOL.msi -Stream *


   FileName: C:\Temp\ADSTest\SetupSlxWOL.msi

Stream                   Length
------                   ------
:$DATA                   496640
Zone.Identifier              26</pre>
<p> </p>
<h5 style="padding-left: 30px;">Visualiser le contenu d'un flux alternatif d'un fichier</h5>
<pre style="font-size: 10pt; font-family: 'Courier New',Courier,'Nimbus Mono L',monospace; width: 100%; color: white; overflow: visible; direction: ltr; text-align: left; line-height: 14pt; background-color: #000080; border-style: none; margin: 0; padding: 5px;">PS C:\&gt; Get-Content .\SetupSlxWOL.msi -Stream "Zone.Identifier"
[ZoneTransfer]
ZoneId=3</pre>
<p> </p>
<h5 style="padding-left: 30px;">Vider un flux alternatif d'un fichier</h5>
<pre style="font-size: 10pt; font-family: 'Courier New',Courier,'Nimbus Mono L',monospace; width: 100%; color: white; overflow: visible; direction: ltr; text-align: left; line-height: 14pt; background-color: #000080; border-style: none; margin: 0; padding: 5px;">PS C:\&gt; Clear-Content .\SetupSlxWOL.msi -Stream "Zone.Identifier"
PS C:\&gt; Get-Item .\SetupSlxWOL.msi -Stream *


   FileName: C:\Temp\ADSTest\SetupSlxWOL.msi

Stream                   Length
------                   ------
:$DATA                   496640
Zone.Identifier               0</pre>
<p> </p>
<h5 style="padding-left: 30px;">Supprimer un flux alternatif d'un fichier</h5>
<pre style="font-size: 10pt; font-family: 'Courier New',Courier,'Nimbus Mono L',monospace; width: 100%; color: white; overflow: visible; direction: ltr; text-align: left; line-height: 14pt; background-color: #000080; border-style: none; margin: 0; padding: 5px;">PS C:\&gt; Remove-Item .\SetupSlxWOL.msi -Stream "Zone.Identifier"
PS C:\&gt; Get-Item .\SetupSlxWOL.msi -Stream *


   FileName: C:\Temp\ADSTest\SetupSlxWOL.msi

Stream                   Length
------                   ------
:$DATA                   496640</pre><br /><a href='http://www.silogix.fr/blog-silogix/gerer-les-alternate-data-streams-avec-powershell-2-et-powershell-3.aspx'>Jean-Paul Blanc</a>&nbsp;&nbsp;<a href='http://www.silogix.fr/blog-silogix/gerer-les-alternate-data-streams-avec-powershell-2-et-powershell-3.aspx'>...</a>]]></description>
      <link>http://www.silogix.fr/blog-silogix/gerer-les-alternate-data-streams-avec-powershell-2-et-powershell-3.aspx</link>
      <author>Jean-Paul Blanc</author>
      <comments>http://www.silogix.fr/blog-silogix/gerer-les-alternate-data-streams-avec-powershell-2-et-powershell-3.aspx</comments>
      <guid isPermaLink="true">http://www.silogix.fr/blog-silogix/gerer-les-alternate-data-streams-avec-powershell-2-et-powershell-3.aspx</guid>
      <pubDate>Wed, 09 May 2012 13:05:00 GMT</pubDate>
    </item>
    <item>
      <title>PowerShell V3 : du nouveau dans l'aide</title>
      <description><![CDATA[<p> </p>
<p>L'aide est un point fort de Microsoft PowerShell 1.0 et 2.0 avec notamment la disponibilité, en ligne de commande, des manuels de références et de programmation à travers l'applet de commande <strong>Get-Help</strong>.</p>
<div><code><kbd> <strong># Manuel de référence pour une applet de commande :</strong><br />Get-Help Get-Command -Full</kbd></code></div>
<div><code><kbd> <strong># Manuels de programmation :</strong><br />Get-Help About_*</kbd></code></div>
<p>D'ou la surprise quand on passe la première commande <strong>Get-Help</strong> dans la version 3.0 :</p>
<p><img title="Aide dans PowerShell V3.0" src="http://www.silogix.fr/Data/Sites/1/imgOutils/2012-05-02-powershell-v30-aide/capture1.png" alt="Aide dans PowerShell V3.0" width="550" height="269" /></p>
<div><code><kbd> REMARKS<br /> Get-Help cannot find the Help files for this cmdlet on this computer. It is displaying only partial help.<br />      -- To download and install Help files for the module that includes this cmdlet, use Update-Help.<br />      -- To view the Help topic for this cmdlet online, type: "Get-Help Get-Command -Online" or<br />         go to http://go.microsoft.com/fwlink/?LinkID=113309. </kbd></code></div>
<p>Associé au fait que le dossier <strong>$pshome\en-us</strong> ne contient aucun fichier d'aide :</p>
<p><img title="Contenu de dossier $pshome\En-US en PowerShell V3.0" src="http://www.silogix.fr/Data/Sites/1/imgOutils/2012-05-02-powershell-v30-aide/contenu-initial-dossier-en-us-en-v3.png" alt="Contenu de dossier $pshome\En-US en PowerShell V3.0" width="550" height="203" /></p>
<p>En fait dans PowerShell 3.0 la documentation n'est pas installée avec le produit. La raison est que Microsoft à souhaité mettre en place le moyen de conserver une documentation à jour.</p>
<p>Pour cela, comme dans les versions précédentes, l'utilisateur peut utiliser le paramètre <strong>-Online</strong> de l'applet de commande<strong> Get-Help</strong>. Mais dans PowerShell 3.0 l'utilisateur peut en plus utiliser les nouvelles applets de commande <strong>Update-Help</strong> et <strong>Save-Help</strong> pour charger l'aide depuis Internet (par défaut) ou un disque local et la sauvegarder sur un disque local.</p>
<p><em><span style="text-decoration: underline;">Remarque</span></em> : J'ai installée <em>'Windows Management Framework 3.0 Beta'</em> en version anglaise, sur un système Windows Seven anglais dont la culture courante est le français (histoire d'avoir le bon clavier). Afin de télécharger la documentation anglaise (la seule disponible à ce jour) il faut ajouter le paramètre <strong>-UICulture en-US</strong>. L'option <strong>-Force</strong> permet de forcer le rechargement de la documentation.</p>
<p>Les commandes suivantes permettent de télécharger l'aide depuis internet, de la sauvegarder sur un disque réseau puis ensuite de la télécharger depuis ce disque réseau. Cela illustre la possibilité de mettre la documentation à jour, mais aussi de la tenir à disposition pour des utilisateurs du réseau local qui n'auraient pas directement acces à Internet.</p>
<p><img title="Mise à jour et sauvegarde de l'aide en PowerShell 3.0" src="http://www.silogix.fr/Data/Sites/1/imgOutils/2012-05-02-powershell-v30-aide/update-help-save-help.png" alt="Mise à jour et sauvegarde de l'aide en PowerShell 3.0" width="550" height="75" /></p>
<p>L'aide est sauvegardée sous la forme de fichiers .Cab et .XML.</p>
<div><code><kbd> Microsoft.PowerShell.Core_00000000-0000-0000-0000-000000000000_en-US_HelpContent.cab<br /> Microsoft.PowerShell.Core_00000000-0000-0000-0000-000000000000_HelpInfo.xml<br /> Microsoft.PowerShell.Diagnostics_ca046f10-ca64-4740-8ff9-2565dba61a4f_en-US_HelpContent.cab<br /> Microsoft.PowerShell.Diagnostics_ca046f10-ca64-4740-8ff9-2565dba61a4f_HelpInfo.xml<br /> Microsoft.PowerShell.Host_56d66100-99a0-4ffc-a12d-eee9a6718aef_en-US_HelpContent.cab<br /> Microsoft.PowerShell.Host_56d66100-99a0-4ffc-a12d-eee9a6718aef_HelpInfo.xml<br /> Microsoft.PowerShell.Management_eefcb906-b326-4e99-9f54-8b4bb6ef3c6d_en-US_HelpContent.cab<br /> Microsoft.PowerShell.Management_eefcb906-b326-4e99-9f54-8b4bb6ef3c6d_HelpInfo.xml<br /> Microsoft.PowerShell.Security_a94c8c7e-9810-47c0-b8af-65089c13a35a_en-US_HelpContent.cab<br /> Microsoft.PowerShell.Security_a94c8c7e-9810-47c0-b8af-65089c13a35a_HelpInfo.xml<br /> Microsoft.PowerShell.Utility_1da87e53-152b-403e-98dc-74d7b4d63d59_en-US_HelpContent.cab<br /> Microsoft.PowerShell.Utility_1da87e53-152b-403e-98dc-74d7b4d63d59_HelpInfo.xml<br /> Microsoft.WSMan.Management_766204a6-330e-4263-a7ab-46c87afc366c_en-US_HelpContent.cab<br /> Microsoft.WSMan.Management_766204a6-330e-4263-a7ab-46c87afc366c_HelpInfo.xml</kbd></code></div>
<p>Après la mise à jour de l'aide il est enfin possible de consulter l'aide en ligne de commande ansi que les fichier About_* dont <a title="What's New in Windows PowerShell 3.0" href="http://technet.microsoft.com/en-us/library/hh857339.aspx" target="_blank">about_Windows_PowerShell_3.0</a>.</p>
<p> Outre l'aide Internet une aide graphique sur le poste local est intégrée à PowerShell 3.0 à travers l'applet de commande <strong>Show-Command. </strong>Cette CmdLet est le pendant graphique de l'applet de commande <strong>Get-Command</strong>. Utilisée pour une applet de commande elle permet :</p>
<ol>
<li>De constituer une ligne de commande à partir d'un formulaire</li>
<ol>
<li>Pour l'exécuter directement</li>
<li>Pour la copier dans le presse papier</li>
</ol>
<li>De discerner les jeux paramètres de chaque "ParameterSet"</li>
<li>De discerner les paramètres communs</li>
</ol>
<p><img title="Exemple de fenêtre Show-Command" src="http://www.silogix.fr/Data/Sites/1/imgOutils/2012-05-02-powershell-v30-aide/show-command.png" alt="Exemple de fenêtre Show-Command" width="381" height="452" /></p>
<p>L'applet de commande Show-Command peut-être appelée seule, elle permet alors de découvrir la totalité des Cmdlets et des fonctions accessibles au travers des modules disponibles :</p>
<p><img title="Fenêtre Show-Command" src="http://www.silogix.fr/Data/Sites/1/imgOutils/2012-05-02-powershell-v30-aide/show-command-modules.png" alt="Fenêtre Show-Command" width="349" height="550" /></p><br /><a href='http://www.silogix.fr/blog-silogix/powershell-v3-du-nouveau-dans-laide.aspx'>Jean-Paul Blanc</a>&nbsp;&nbsp;<a href='http://www.silogix.fr/blog-silogix/powershell-v3-du-nouveau-dans-laide.aspx'>...</a>]]></description>
      <link>http://www.silogix.fr/blog-silogix/powershell-v3-du-nouveau-dans-laide.aspx</link>
      <author>Jean-Paul Blanc</author>
      <comments>http://www.silogix.fr/blog-silogix/powershell-v3-du-nouveau-dans-laide.aspx</comments>
      <guid isPermaLink="true">http://www.silogix.fr/blog-silogix/powershell-v3-du-nouveau-dans-laide.aspx</guid>
      <pubDate>Thu, 03 May 2012 08:47:00 GMT</pubDate>
    </item>
    <item>
      <title>Une version Française de Start-Demo.PS1</title>
      <description><![CDATA[<p> </p>
<p> </p>
<h4 style="text-align: right;"><a title="Directory Object Picker en PowerShell" href="http://www.silogix.fr/developpement/outils/Ressources-PowerShell/un-script-permettant-de-derouler-des-démonstrations-en-ligne-de-commande-powershell.aspx" target="_self">Vers le téléchargement des fichiers.</a></h4>
<p> </p>
<p>Start-Demo est un script PowerShell qui permet de démontrer l'usage de la ligne de commande PowerShell en se concentrant sur les explications et non sur la syntaxe. Une des premières versions que j'ai trouvé était celle de <em>Jeffrey Snover</em> publié en 2007 dans <a title="Version de Jeffrey Snover" href="http://blogs.msdn.com/b/powershell/archive/2007/03/03/start-demo-help-doing-demos-using-powershell.aspx" target="_blank">son blog MSDN</a>. Je suis parti de la version modifiée par <a title="Version de Joel 'Jaykul' Bennett" href="http://huddledmasses.org/powershell-start-demo-3/" target="_blank"><em>Joel 'Jaykul' Bennett</em></a> quelques mois plus tard pour la traduire en français et corriger deux trois petites choses.</p>
<p>Les commandes constituant la démonstration sont à saisir dans un fichier texte qui alterne des lignes commençant par le caractère #, ce seront les lignes de commentaire et des lignes de commandes PowerShell comme ceci :</p>
<div><code><kbd> # Je me place dans mon fichier de travail<br /> Set-Location "c:\Silogix\Démos"<br /> # Usage de Set-Content<br /> Set-Content -Path .\Silogix1.txt -Value "Un","Deux"<br /> # Force PowerShell a demander les paramètres<br /> Set-Content -Path .\Silogix2.txt<br /> # Compare les deux fichiers<br /> Compare-Object ${c:\Silogix\Démos\Silogix1.txt} ${c:\Silogix\Démos\Silogix2.txt} </kbd></code></div>
<p>Le fichier est ensuite soumis au script :</p>
<div><code><kbd>PS C:\Silogix\Démos&gt; .\Start-demo-fr.ps1 .\démoSD1.txt</kbd></code></div>
<p>Ce qui donne, lorsque le démonstrateur à validé chacune des commades :</p>
<p><img title="Start Démo" src="http://www.silogix.fr/Data/Sites/1/imgOutils/2011-12-16-start-demo/start-demo-1.png" alt="Start Démo" width="550" height="398" /></p>
<p> L'utilisateur dispose de plusieurs touches lui permettant d'interagir avec le script de démonstration.</p>
<p><img title="Start Démo" src="http://www.silogix.fr/Data/Sites/1/imgOutils/2011-12-16-start-demo/start-demo-2.png" alt="Start Démo" width="550" height="209" /></p>
<p> </p><br /><a href='http://www.silogix.fr/blog-silogix/une-version-francaise-de-start-demo-PS1-.aspx'>Jean-Paul Blanc</a>&nbsp;&nbsp;<a href='http://www.silogix.fr/blog-silogix/une-version-francaise-de-start-demo-PS1-.aspx'>...</a>]]></description>
      <link>http://www.silogix.fr/blog-silogix/une-version-francaise-de-start-demo-PS1-.aspx</link>
      <author>Jean-Paul Blanc</author>
      <comments>http://www.silogix.fr/blog-silogix/une-version-francaise-de-start-demo-PS1-.aspx</comments>
      <guid isPermaLink="true">http://www.silogix.fr/blog-silogix/une-version-francaise-de-start-demo-PS1-.aspx</guid>
      <pubDate>Fri, 20 Jan 2012 10:18:00 GMT</pubDate>
    </item>
    <item>
      <title>Sélectionner des utilisateurs ou des groupes en PowerShell avec la boite de dialogue Directory Object Picker</title>
      <description><![CDATA[<p> </p>
<p> </p>
<h4 style="text-align: right;"><a title="Directory Object Picker en PowerShell" href="http://www.silogix.fr/developpement/outils/Ressources-PowerShell/Directory-Object-Picker-en-PowerShell.aspx" target="_self">Vers le téléchargement des fichiers.</a></h4>
<p> </p>
<p>La boite de dialogue Directory Object Picker permet à un utilisateur de choisir un ou plusieurs objets de type utilisateur, groupe ou ordinateur dans un domaine ou sur un ordinateur en groupe de travail. <a title="Directory Object Picker" href="http://msdn.microsoft.com/en-us/library/ms675899.aspx" target="_blank">Un article du MSDN</a> explique comment mettre en œuvre cet objet en C++. J'ai trouvé sur <a title="Directory Object Picker en C#" href="http://www.csharpfr.com//code.aspx?ID=52023" target="_blank">Codes-Sources</a> une adaptation de l'exemple Microsoft en .NET. J'ai de mon coté adapté cet exemple pour fabriquer un assembly qui puisse être aisément utilisé en PowerShell et notament ramener des attributs pour les objets de l'annuaire.</p>
<ul>
<li>
<h3>Le premier exemple illustre l'usage local, sur un poste workgroup.</h3>
</li>
</ul>
<p>Le script suivant charge l'assembly <kbd>DirectoryObjectPicker.dll</kbd> et demande l'affichage de la boite de dialogue de recherche qui permet de sélectionner des objets dans la base de compte locale. la variable  <kbd>$res </kbd>contient l'objet ou la liste d'objets désirés.</p>
<div><code>
<pre class="csharpcode"><span class="rem"># Obj-Add-Type-ADObjectPicker.PS1</span>
Clear-Host

Add-Type -Path <span class="str">"C:\silogix\DirectoryObjectPicker.dll"</span>

$ADObjectPicker = New-Object  DirectoryObjectPicker.Picker 

<span class="rem"># Exemple utilisant les valeurs par défaut</span>
$Res = $ADObjectPicker.ShowDialog()

$Res
</pre>
</code></div>
<p>Affiche (après séléction d'un utilisateur) :</p>
<p><img title="Directory Object Picker" src="http://www.silogix.fr/Data/Sites/1/imgOutils/2011-11-16-directoryobjectpicker/directory-object-picker-wkg.png" alt="Directory Object Picker" width="464" height="247" /></p>
<p>Ce qui donne comme résultat pour l'affichage de la variable <kbd>$res</kbd> :</p>
<div><code><kbd> ADsPath     : LDAP://&lt;SID=01050000000000051500000097b5555f02e311bef8182f66e9030000&gt;<br /> ObjectClass : User<br /> UPN         :<br /> ScopeType   : TARGET_COMPUTER<br /> htAttributes : {}</kbd></code></div>
<ul>
<li>
<h3>Le second exemple illustre un usage sur un poste domaine.</h3>
</li>
</ul>
<p>Le script suivant charge l'assembly <kbd>DirectoryObjectPicker.dll</kbd> et demande l'affichage de la boite de dialogue de recherche qui permet de sélectionner des objets dans l'annuaire. Il est possible de préciser la liste des attributs que l'on souhaite retrouver pour chaque objet sélectionné. La variable <kbd>$res</kbd> contient l'objet ou la liste des objets désirés avec leurs attributs.</p>
<div><code>
<pre class="csharpcode"><span class="rem"># Obj-Add-Type-ADObjectPicker.PS1</span>
Clear-Host

Add-Type -Path <span class="str">"C:\temp\DirectoryObjectPicker.dll"</span>

$ADObjectPicker = New-Object  DirectoryObjectPicker.Picker 

<span class="rem"># Exemple utilisant les valeurs par défaut</span>
$attributes = <span class="str">"samAccountName"</span>,<span class="str">"sn"</span>, <span class="str">"distinguishedName"</span>, <span class="str">"givenName"</span>
$Res = $ADObjectPicker.ShowDialog($true, <span class="str">"WM2008R2ENT"</span>, $attributes)

$Res
write-host <span class="str">"------------------------------------------"</span>
$Res | select -Property RDN -ExpandProperty htAttributes 
</pre>
</code></div>
<p>Affiche :</p>
<p><img title="Directory Object Picker en domaine" src="http://www.silogix.fr/Data/Sites/1/imgOutils/2011-11-16-directoryobjectpicker/directory-object-picker-dom.png" alt="Directory Object Picker en domaine" width="465" height="248" /></p>
<p>Ce qui donne comme résultat pour l'affichage de la variable $res :</p>
<div><code><kbd>RDN          : Jean Paul Blanc<br /> ADsPath      : LDAP://&lt;SID=010500000000000515000000f533b8b9084cb230e5577fc451040000&gt;<br /> ObjectClass  : user<br /> UPN          : jpb@dom.fr<br /> ScopeType    : GLOBAL_CATALOG<br /> htAttributes : {givenName, samAccountName, sn, distinguishedName}<br /> <br /> ------------------------------------------<br /> Key   : givenName<br /> Value : Jean Paul<br /> Name  : givenName<br /> <br /> Key   : samAccountName<br /> Value : jpb<br /> Name  : samAccountName<br /> <br /> Key   : sn<br /> Value : Blanc<br /> Name  : sn<br /> <br /> Key   : distinguishedName<br /> Value : CN=Jean Paul Blanc,OU=MonOu,DC=dom,DC=fr<br /> Name  : distinguishedName</kbd></code></div>
<p> </p><br /><a href='http://www.silogix.fr/blog-silogix/selectionner-des-utilisateurs-ou-des-groupes-en-powershell-avec-la-boite-de-dialogue-directory-object-picker.aspx'>Jean-Paul Blanc</a>&nbsp;&nbsp;<a href='http://www.silogix.fr/blog-silogix/selectionner-des-utilisateurs-ou-des-groupes-en-powershell-avec-la-boite-de-dialogue-directory-object-picker.aspx'>...</a>]]></description>
      <link>http://www.silogix.fr/blog-silogix/selectionner-des-utilisateurs-ou-des-groupes-en-powershell-avec-la-boite-de-dialogue-directory-object-picker.aspx</link>
      <author>Jean-Paul Blanc</author>
      <comments>http://www.silogix.fr/blog-silogix/selectionner-des-utilisateurs-ou-des-groupes-en-powershell-avec-la-boite-de-dialogue-directory-object-picker.aspx</comments>
      <guid isPermaLink="true">http://www.silogix.fr/blog-silogix/selectionner-des-utilisateurs-ou-des-groupes-en-powershell-avec-la-boite-de-dialogue-directory-object-picker.aspx</guid>
      <pubDate>Tue, 15 Nov 2011 19:07:00 GMT</pubDate>
    </item>
    <item>
      <title>PowerShell V3 c'est parti !</title>
      <description><![CDATA[<p> </p>
<p> </p>
<h3>Comment tester la nouvelle version de PowerShell ?</h3>
<ul>
<li>Il est possible d'installer la '<a title="Windows Developer Preview de Windows 8" href="http://msdn.microsoft.com/en-us/windows/apps/br229516" target="_self">Windows Developer Preview de Windows 8</a>'. On y retrouve PowerShell V3.</li>
</ul>
<ul>
<li>Si on dispose d'un poste Windows Seven SP1 ou Windows Server 2008 R2 SP1, <strong>en version anglaise</strong>, il est possible d'installer <a title="Windows Management Framework 3.0 Community Technology Preview (CTP) #1" href="http://blogs.msdn.com/b/powershell/archive/2011/09/20/windows-management-framework-3-0-community-technology-preview-ctp-1-available-for-download.aspx" target="_blank">'Windows Management Framework 3.0 Community Technology Preview (CTP) #1</a>', qui installe la version 3 de Powershell ; à condition d'avoir le Framework 4.0 d'installé.</li>
</ul>
<p><img title="PowerShel V3 dans Windows 8" src="http://www.silogix.fr/Data/Sites/1/imgOutils/2011-10-03-powershellv3/capture1.png" alt="PowerShel V3 dans Windows 8" width="451" height="304" /></p>
<h3>A première vue, Quoi de neuf ?</h3>
<ul>
<li>PowerShell V3 s'appuie sur le Framework 4.0. Rien de surprenant, certains utilisateurs de PowerShell V2 utilisaient déjà les caractéristique de C# 4.0 (voir <a title="PowerShell V2 et Frmework .NET 4.0" href="http://www.silogix.fr/Blog-Silogix/exécution-de-powershell-v20-sur-un-framework-net-40.aspx" target="_blank">Exécution de PowerShell V2.0 sur un Framework .NET 4.0</a>). Cependant s'il en est de même pour la version finale, cela risque de retarder les mises à jour à production, ou il faudrait à la fois installer l'update de PowerShell (une quinzaine de mégas) et le Framework 4.0 beaucoup plus conséquent.</li>
<li>Même si le système des Snapins est conservé pour compatibilité ascendante, les applets de commandes (Cmdlets) sont maintenant toutes fournies par des modules.</li>
<li>Les modules qui devaient êtres explicitement chargés dans la version 2 (ou ils sont apparus), sont maintenant chargés au premier appel d'une applet de commande qui les composes. On peut maintenant parler de modules à chargement dynamique ou de chargement de modules à l'appel des CmdLets (Load On Call).</li>
<li>Toujours plus de CmdLet : 376 dans PowerShell V3 contre 236 en PowerShell V2 et 129 en PowerShell V1, mais aussi des changements dans les Alias, les fonction et les paramètres des Cmdlets existantes.</li>
</ul>
<h3>Officiellement :</h3>
<ol>
<li>Orientation Flux de Travail (Workflow) : Utilisation de Windows Workflow Foundation en ligne de commande.</li>
<li>Des sessions robustes capables de remonter automatiquement en cas de coupures réseau, mais aussi d'arrêter le poste et de reprendre une session depuis un autre poste.</li>
<li>Ordonnanceur de jobs, pour les exécuter régulièrement ou en réponse à un évènement.</li>
<li>Délégation d'administration, pour que des utilisateurs avec des doits restreins puissent effectuer des tâches critiques.</li>
<li>Simplification de la syntaxe pour la rendre plus proche du langage naturel.</li>
<li>Amélioration de la découverte des applets de commande et chargement automatique des modules.</li>
<li>Une applet de commande Show-Command et un Add-ON dans ISE qui permettent de retrouver rapidement la bonne Cmdlet avec les bons paramètres.</li>
</ol>
<p>J'espère bien creuser tout cela dans de prochains posts.</p><br /><a href='http://www.silogix.fr/blog-silogix/powershell-v3-cest-parti-.aspx'>Jean-Paul Blanc</a>&nbsp;&nbsp;<a href='http://www.silogix.fr/blog-silogix/powershell-v3-cest-parti-.aspx'>...</a>]]></description>
      <link>http://www.silogix.fr/blog-silogix/powershell-v3-cest-parti-.aspx</link>
      <author>Jean-Paul Blanc</author>
      <comments>http://www.silogix.fr/blog-silogix/powershell-v3-cest-parti-.aspx</comments>
      <guid isPermaLink="true">http://www.silogix.fr/blog-silogix/powershell-v3-cest-parti-.aspx</guid>
      <pubDate>Mon, 03 Oct 2011 04:35:00 GMT</pubDate>
    </item>
    <item>
      <title>Quel éditeur de script PowerShell gratuit puis-je utiliser sur Windows XP SP2 ?</title>
      <description><![CDATA[<p> </p>
<p> </p>
<p>Heureusement, il est encore possible de trouver la dernière version de PowerGUI qui fonctionne sous PowerShell V1.0, il sagit de <a title="PowerGui Editor for PowerShell V1" href="http://powergui.org/entry.jspa?externalID=3085&amp;categoryID=299" target="_blank">PowerGUI.1.9.6.1027</a>. Vous trouverez ci-dessous la version <a title="PowerGUI modifié" href="http://www.silogix.fr/Data/Sites/1/imgOutils/2011-09-28powergui1961027/powergui.1.9.6.1027-bis.zip" target="_self">PowerGUI.1.9.6.1027-Bis</a> dans laquelle la condition de lancement sur la version d'Internet Explorer à été retirée, cela empêchait d'installer le produit dans certaines configuration de Windows Server 2003.</p><br /><a href='http://www.silogix.fr/blog-silogix/Quel-éditeur-de-script-powershell-gratuit-puis-je-utiliser-sur-windows-xp-sp2-.aspx'>Jean-Paul Blanc</a>&nbsp;&nbsp;<a href='http://www.silogix.fr/blog-silogix/Quel-éditeur-de-script-powershell-gratuit-puis-je-utiliser-sur-windows-xp-sp2-.aspx'>...</a>]]></description>
      <link>http://www.silogix.fr/blog-silogix/Quel-éditeur-de-script-powershell-gratuit-puis-je-utiliser-sur-windows-xp-sp2-.aspx</link>
      <author>Jean-Paul Blanc</author>
      <comments>http://www.silogix.fr/blog-silogix/Quel-éditeur-de-script-powershell-gratuit-puis-je-utiliser-sur-windows-xp-sp2-.aspx</comments>
      <guid isPermaLink="true">http://www.silogix.fr/blog-silogix/Quel-éditeur-de-script-powershell-gratuit-puis-je-utiliser-sur-windows-xp-sp2-.aspx</guid>
      <pubDate>Wed, 28 Sep 2011 19:04:00 GMT</pubDate>
    </item>
    <item>
      <title>Comment définir le "Namespace" dans un service WCF (supprimer la référence à tempuri.org)</title>
      <description><![CDATA[<p>Lorsque vous créez un service WCF, par défaut le Namespace XML (xmlns) est positionné a la valeur “http://tempuri.org”. Cette valeur est visible dans le fichier WSDL. Normalement, tous les Web Services XML doivent utiliser un Namespace unique afin que les applications clientes les distinguent les uns des autres. Le Nom “tempuri.org” est utilisable pendant la phase de développement, mais lors du déploiement, il faut mettre un nom permanent et unique. En effet toutes les méthodes d’un service sont repérées par rapport à leur espace de nom (“Vocabulaire XML”). Donc, si vous laissez le nom par défaut, vous ne pourrez pas avoir proprement 2 méthodes dans 2 services différents qui portent le même nom.</p>
<p>Pour modifier ce nom “http://tempuri.org” vous devez procéder comme suit :</p>
<p>1 – Dans le contrat de service, définissez la propriété Namespace en tant qu’attribut du constructeur de l’objet ServiceContrat</p>
<blockquote>
<p>[ServiceContract(Namespace = "<a href="http://monservice.silogix.fr&quot;)]">http://monservice.silogix.fr")]</a><br />public interface IMyService</p>
</blockquote>
<p>2 – Dans la classe de mise en oeuvre du service, créer un attribut “ServiceBehavior” avec la propriété “Namespace”</p>
<blockquote>
<p>[ServiceBehavior(Namespace = "<a href="http://monservice.silogix.fr&quot;)]">http://monservice.silogix.fr")]</a><br />class MyService : IMyService</p>
</blockquote>
<p>3 – dans tous les bindings, définissez la propriété "”bindingNamespace”</p>
<blockquote>
<p>&lt;endpoint binding="basicHttpBinding" bindingNamespace=<a href="http://monservice.silogix.fr">http://monservice.silogix.fr</a>....</p>
</blockquote>
<p>Une fois ces 3 modifications faites, vous aurez un service avec un Namespace XML propre, c’est à dire définit à ce que vous souhaitez.</p>
<p>- Chic</p><br /><a href='http://www.silogix.fr/comment-définir-le-namespace-dans-un-service-wcf-supprimer-la-référence-à-tempuriorg.aspx'>chic</a>&nbsp;&nbsp;<a href='http://www.silogix.fr/comment-définir-le-namespace-dans-un-service-wcf-supprimer-la-référence-à-tempuriorg.aspx'>...</a>]]></description>
      <link>http://www.silogix.fr/comment-définir-le-namespace-dans-un-service-wcf-supprimer-la-référence-à-tempuriorg.aspx</link>
      <author>chic</author>
      <comments>http://www.silogix.fr/comment-définir-le-namespace-dans-un-service-wcf-supprimer-la-référence-à-tempuriorg.aspx</comments>
      <guid isPermaLink="true">http://www.silogix.fr/comment-définir-le-namespace-dans-un-service-wcf-supprimer-la-référence-à-tempuriorg.aspx</guid>
      <pubDate>Tue, 27 Sep 2011 07:02:00 GMT</pubDate>
    </item>
    <item>
      <title>Utilisation des sessions dans un HttpHandler (fichier ASHX)</title>
      <description><![CDATA[<p>Lorsque vous écrivez un handler HTTP en ASP.NET (httphandler, fichier .ASHX) par défaut, les variables de session ne sont pas utilisables. Si vous souhaitez utiliser l’état de session, vous devez tout simplement mettre en oeuvre l’interface <strong>IReadOnlySessionState : </strong></p>
<blockquote>
<p><strong>&lt;% @ webhandler language="C#" class="exempleHandler" %&gt;</strong></p>
<p>public class exempleHandler: IHttpHandler, <strong>IReadOnlySessionState</strong><br />{<br /> <strong> public bool IsReusable<br /> {<br /> get<br /> {<br /> return true;<br /> }<br /> }</strong></p>
<p>public void ProcessRequest(HttpContext context)<br /> {<br /><strong> // accès aux variables de session via context.Session</strong></p>
<p>}<br />}</p>
</blockquote>
<p>- Chic</p><br /><a href='http://www.silogix.fr/utilisation-des-sessions-dans-un-httphandler-fichier-ashx.aspx'>chic</a>&nbsp;&nbsp;<a href='http://www.silogix.fr/utilisation-des-sessions-dans-un-httphandler-fichier-ashx.aspx'>...</a>]]></description>
      <link>http://www.silogix.fr/utilisation-des-sessions-dans-un-httphandler-fichier-ashx.aspx</link>
      <author>chic</author>
      <comments>http://www.silogix.fr/utilisation-des-sessions-dans-un-httphandler-fichier-ashx.aspx</comments>
      <guid isPermaLink="true">http://www.silogix.fr/utilisation-des-sessions-dans-un-httphandler-fichier-ashx.aspx</guid>
      <pubDate>Mon, 05 Sep 2011 18:50:00 GMT</pubDate>
    </item>
    <item>
      <title>Ou stocker le mot de passe d'un script ?</title>
      <description><![CDATA[<p> </p>
<p> </p>
<h4 style="text-align: right;"><a title="Chiffrement du mot de passe" href="http://www.silogix.fr/developpement/outils/Ressources-PowerShell/chiffrement-du-mot-de-passe-ou-de-chaines-de-connexion-.aspx" target="_self">Vers le téléchargement des scripts.</a></h4>
<p> </p>
<p>Le principe consiste à chiffre le mot de passe ou la chaine de connexion sur le disque.</p>
<h3>L'ordinateur en tant qu'utilisateur.</h3>
<p>Les deux scripts qui suivent utilisent l'assembly de sécurité du Framework .NET. pour chiffrer le secret. Une particularité intéressante, pour les machines de type serveur, est qu'il est possible de protégé le secret par l'identité de la machine. Je part du principe que toute personne ayant accès à la machine (qui peut exécuter du code sur la machine) peut avoir accès au mot de passe.</p>
<p><strong>Remarque</strong> : Il est a noter que le tableau d'entier issue du chiffrement est ensuite codé en base 64 ce qui assure son intégrité lors de transfert à travers des systèmes hétérogènes ou lors d'ouverture du fichier contenant le secret chiffré par des éditeurs peu scrupuleux. Cela rend le secret chiffré <em>éditable</em>.</p>
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode"><code># Assembly du Framework .NET nécessaire
Add-Type -assembly System.Security

# Chaine à chiffrer
$passwordASCII = Read-Host -Prompt "Entrer le mot de passe"

# Passage en tableau d'entier
$enc = [system.text.encoding]::Unicode
$clearPWD_ByteArray = $enc.GetBytes( $passwordASCII.tochararray())

# chiffrememnt
$secLevel = [System.Security.Cryptography.DataProtectionScope]::LocalMachine
$bakCryptedPWD_ByteArray = [System.Security.Cryptography.ProtectedData]::Protect($clearPWD_ByteArray, $null, $secLevel)

# Passage en Base 64 et stockage
$B64PWD_ByteArray = [Convert]::ToBase64String($bakCryptedPWD_ByteArray)
Set-Content -LiteralPath c:\Temp\pass.txt -Value $B64PWD_ByteArray</code></pre>
<p><strong>Attention</strong> : J'ai pris soin d'utiliser unicode comme mécanisme de codage au passage de la chaine de caractère au tableau d'entiers et inversement. Cela m'assure de restituer des éventuels caractères spéciaux (caractères accentués).</p>
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode"><code># Assembky du Framework .NET nécessaire
Add-Type -assembly System.Security

# Récupération depuis la Base 64 et stockage
$resCryptedPWD_ByteArray = [Convert]::FromBase64String((Get-Content -LiteralPath c:\Temp\pass.txt))

# Déchiffrement
$secLevel = [System.Security.Cryptography.DataProtectionScope]::LocalMachine
$clearPWD_ByteArray = [System.Security.Cryptography.ProtectedData]::Unprotect( $resCryptedPWD_ByteArray, $null, $secLevel )

# Récupération du tableau d'entier
$enc = [system.text.encoding]::Unicode
$enc.GetString($clearPWD_ByteArray)</code></pre>
<h3>Différentes Portées.</h3>
<p>En fonction de la porté de protection on peut assurer un chiffrment pour une personne ou un ordinateur</p>
<p>
<ul>
<li><strong>CurrentUser</strong> : Les données protégées sont associées à l'utilisateur en cours. Seuls les threads exécutés dans le contexte utilisateur en cours peuvent ôter la protection des données</li>
<li><strong>LocalMachine</strong> : Les données protégées sont associées au contexte de l'ordinateur. Tout processus qui s'exécute sur l'ordinateur peut ôter la protection des données. Cette valeur d'énumération est généralement utilisée dans les applications spécifiques au serveur qui s'exécutent sur un serveur où les utilisateurs non fiables n'ont pas accès.</li>
</ul>
Sur le principe de la poortée utilisateur si le système cible supporte l'EFS (Encrypted File System) il est assez simple de chiffrer un fichier.</p>
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode"><code>Set-Content -Path c:\Temp\pass.txt -Value "le texte à Protéger" -Force

# Chiffrement du fichier (si EFS est supporté)
$file = Get-Item c:\Temp\pass.txt
$file.Encrypt()

Read-Host -Prompt "Vérifiez le fichier apparait en vert" 

# Il est lisible par l'utilisateur uniquement
Get-Content c:\Temp\pass.txt 

Read-Host -Prompt "Le chiffrement va être supprimé"

# Supprime le chiffrement
$file = Get-Item c:\Temp\pass.txt
$file.Decrypt()</code></pre><br /><a href='http://www.silogix.fr/blog-silogix/ou-stocker-le-mot-de-passe-dun-script-.aspx'>Jean-Paul Blanc</a>&nbsp;&nbsp;<a href='http://www.silogix.fr/blog-silogix/ou-stocker-le-mot-de-passe-dun-script-.aspx'>...</a>]]></description>
      <link>http://www.silogix.fr/blog-silogix/ou-stocker-le-mot-de-passe-dun-script-.aspx</link>
      <author>Jean-Paul Blanc</author>
      <comments>http://www.silogix.fr/blog-silogix/ou-stocker-le-mot-de-passe-dun-script-.aspx</comments>
      <guid isPermaLink="true">http://www.silogix.fr/blog-silogix/ou-stocker-le-mot-de-passe-dun-script-.aspx</guid>
      <pubDate>Tue, 07 Jun 2011 03:44:00 GMT</pubDate>
    </item>
    <item>
      <title>Détection du changement d'utilisateur rapide</title>
      <description><![CDATA[<p> </p>
<h3> 1) <span style="text-decoration: underline;">Comment l'activer et le désactiver</span><span style="text-decoration: underline;"> </span></h3>
<ol class="ordered_dec">
<li class="step">
<p class="para">Cliquez sur le bouton <span class="ui">Démarrer<img title="Buton démarrer" src="http://www.silogix.fr/Data/Sites/1/imgOutils/images-general/image-buton-demmarrer.jpg" alt="Buton démarrer" width="15" height="15" /></span>, tapez <span class="userInput">gpedit.msc</span> dans la zone de recherche, puis appuyez sur la touche Entrée. <img title="Nécessaire d'être administrateur" src="http://www.silogix.fr/Data/Sites/1/imgOutils/images-general/image-autorisation-admin-necessaire.jpg" alt="Nécessaire d'être administrateur" width="13" height="16" /><span class="phrase"> Si vous êtes invité à fournir un mot de passe administrateur ou une confirmation, fournissez le mot de passe ou la confirmation.</span></p>
</li>
<li class="step">
<p class="para">Sous <span class="ui">Configuration ordinateur</span>, cliquez sur la flèche en regard de <span class="ui">Modèles d’administration</span>, puis cliquez sur la flèche en regard de <span class="ui">Système</span>.</p>
</li>
<li class="step">
<p class="para">Cliquez sur le dossier <span class="ui">Ouverture de session</span>.</p>
</li>
<li class="step">
<p class="para lastElement">Double-cliquez sur <span class="ui">Masquer les points d’entrée pour le changement rapide d’utilisateur</span>, cliquez sur <span class="ui">Activé</span>, puis sur <span class="ui">OK</span>.</p>
</li>
</ol>
<h3> 2) <span style="text-decoration: underline;">Le point de vue du développeur WIN32</span></h3>
<p>Un application peut avoir besoin de prendre en charge le changement rapide d'utilisateur. <a title="Gerrer le changement rapide d'utilisateur en Win32 " href="http://support.microsoft.com/kb/310153/en-us" target="_blank">un article de Microsoft</a> explique comment il faut faire (<a title="Gerrer le changement rapide d'utilisateur en WIN32" href="http://support.microsoft.com/kb/310153" target="_blank">il existe même en français</a>).</p>
<h3>3) <span style="text-decoration: underline;">Le point de vue de l'administrateur </span></h3>
<p>En tant qu'administrateur on peut se demander comment surveiller le changement rapide d'utilisateur. J'ai trouvée la réponse dans un <a title="Evènements succeptibles d'intéresser l'administrateur" href="http://help.artaro.eu/index.php/windows-7/essential-windows-7-administration/event-viewer-in-windows-7.html" target="_blank">article</a> qui liste un ensemble d'évènements intéressants pour l'administrateur. Voici les deux évènements en question :</p>
<pre><kbd><code>Event ID 4778 : Un utilisateur a accédé à sa session utilisant le changement d'utilisateur rapide.<br />Event ID 4779 : Un utilisateur a quitté sa session en utilisant le changement d'utilisateur rapide.</code></kbd></pre>
<p>Seulement, ces évènements n'apparraissent dans le journal de sécurité que si la stratégie d'audit est activée pour les évènements d'audit de connexion. Comme le montre l'image suivante :</p>
<p><img title="Statégie d'audit de connexion" src="http://www.silogix.fr/Data/Sites/1/imgOutils/2011-03-18-changement-utilisateur/strategie-audit.png" alt="Statégie d'audit" width="550" height="252" /></p>
<p>Des lors, à chaque usage du changement rapide d'utilisateur le filtrage des évènements 4778 et 4779 donne quelque chose qui ressemble à cela :</p>
<p><img title="Evénement de sécurité lors du changement rapide d'utilisateur" src="http://www.silogix.fr/Data/Sites/1/imgOutils/2011-03-18-changement-utilisateur/evenements-de-securite.png" alt="Evénement de sécurité lors du changement rapide d'utilisateur" width="550" height="106" /></p>
<p>Il est alors possible de récupérer simplement ces évènement en PowerShell.</p>
<pre><kbd><code>clear-Host<br />$UserProperty = @{n="User";e={$_.ReplacementStrings[0]}}<br />$TypeProperty = @{n="Action";e={switch($_.EventID) {4778 {"SwitchOn"} 4779{"SwitchOff"}}}}<br />$TimeProeprty = @{n="Time";e={$_.TimeGenerated}}<br />Get-EventLog -LogName Security -Source Microsoft-Windows-security-auditing | where {$_.EventID -eq 4778 -or $_.EventID -eq 4779} | select $UserProperty,$TypeProperty,$TimeProeprty</code></kbd></pre>
<p> </p>
<h3><span style="text-decoration: underline;">4) Le point de vue du scripteur PowerShell (programmeur .NET)</span></h3>
<p>En .NET il est possible de s'abonner aux évènements système.</p>
<pre><kbd><code>PS&gt; $sysevent = [microsoft.win32.systemevents]<br />PS&gt; $sysevent<br /><br />IsPublic IsSerial Name                                     BaseType<br />-------- -------- ----                                     --------<br />True     False    SystemEvents                             System.Object<br /><br /><br />PS&gt; Register-ObjectEvent -InputObject $sysevent -EventName "SessionSwitch" -Action {[console]::Beep()}<br /><br />Id              Name            State      HasMoreData     Location             Command<br />--              ----            -----      -----------     --------             -------<br />1               fa48b95f-299... NotStarted False                                [console]::Beep()<br /></code></kbd></pre>
<p> Il est possibe de trouver la<a title="Evènement système Microsoft" href="http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents_members%28v=VS.80%29.aspx" target="_blank"> liste complète des évènements sur le site de Micosoft</a>.</p>
<pre><code>DisplaySettingsChanged  Occurs when the user changes the display settings. <br />DisplaySettingsChanging Occurs when the display settings are changing. <br />EventsThreadShutdown    Occurs before the thread that listens for system events is terminated. <br />InstalledFontsChanged   Occurs when the user adds fonts to or removes fonts from the system. <br />LowMemory               Occurs when the system is running out of available RAM. <br />PaletteChanged          Occurs when the user switches to an application that uses a different palette. <br />PowerModeChanged        Occurs when the user suspends or resumes the system. <br />SessionEnded            Occurs when the user is logging off or shutting down the system. <br />SessionEnding           Occurs when the user is trying to log off or shut down the system. <br />SessionSwitch           Occurs when the currently logged-in user has changed. <br />TimeChanged             Occurs when the user changes the time on the system clock. <br />TimerElapsed            Occurs when a windows timer interval has expired. <br />UserPreferenceChanged   Occurs when a user preference has changed. <br />UserPreferenceChanging  Occurs when a user preference is changing. <br /></code></pre>
<p>Pour le désenregistrement c'est :</p>
<p><code>PS&gt; Unregister-Event -SubscriptionId 1<br /></code></p><br /><a href='http://www.silogix.fr/blog-Silogix/Detection-du-changement-dutilisateur-rapide.aspx'>Jean-Paul Blanc</a>&nbsp;&nbsp;<a href='http://www.silogix.fr/blog-Silogix/Detection-du-changement-dutilisateur-rapide.aspx'>...</a>]]></description>
      <link>http://www.silogix.fr/blog-Silogix/Detection-du-changement-dutilisateur-rapide.aspx</link>
      <author>Jean-Paul Blanc</author>
      <comments>http://www.silogix.fr/blog-Silogix/Detection-du-changement-dutilisateur-rapide.aspx</comments>
      <guid isPermaLink="true">http://www.silogix.fr/blog-Silogix/Detection-du-changement-dutilisateur-rapide.aspx</guid>
      <pubDate>Sat, 21 May 2011 09:23:00 GMT</pubDate>
    </item>
  </channel>
</rss>
