PowerShell 32 bits vs 64 bits

Mise en contexte

Vous avez un script PowerShell qui utilise des composantes 64 bits.  Tout va bien lorsque vous l’exécutez directement ou en ligne de commande.  Par contre, lorsque vous tentez d’exécuter le même script à partir d’un logiciel tiers ou d’un programme que vous développez en 32 bits, plus rien ne fonctionne.

Par exemple, vous tentez d’utiliser des commandes liées à un serveur Exchange et lorsque vous tentez de charger le module suivant : Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin

Vous obtenez l’erreur suivante :

Add-PSSnapin : The Windows PowerShell snap-in ‘Microsoft.Exchange.Management.PowerShell.Admin' is not installed on this computer.

Le snap-in est bien installé, malheureusement il ne fonctionne quand 64 bits.  Que faire si on ne peut obtenir ou compiler le programme en 64 bits?

Voici une solution qui consiste à ajouter quelques lignes de code à votre script afin de lancer l’exécution de PowerShell 64 bits.

If ( [IntPtr]::Size * 8 -ne 32 )
    {
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\PowerShell.exe -File $MyInvocation.MyCommand.Path
    }
Else
    {
# Your code here
    }

Source : http://www.madwithpowershell.com/2015/06/64-bit-vs-32-bit-powershell.html

Voilà, il suffit de mettre votre code d’origine à l’endroit indiqué.

Raspberry Pi et capteurs de température

J’ai récemment configuré un Raspberry Pi afin d’obtenir des lectures de température et d’humidité.  Il existe de nombreux articles sur le Net pour y parvenir, mais je vous propose ma méthode de fonctionnement.

Mon objectif était d’utiliser un Raspberry Pi version 1 ou 2 et d’utiliser le capteur de température et d’humidité que j’avais sous la main avec le minimum d’éléments.  Le capteur est un DHT11. Les données de lecture doivent être accessibles par protocole SNMP afin d’être utilisé facilement avec un outils de monitoring.  Dans mon exemple, j’utilise PRTG.

http://osepp.com/products/sensors-arduino-compatible/humidity-temperature-sensor/

clip_image001

 

Pour cette installation, j’ai utilisé la dernière version de Raspbian en date du mois de février 2016. La version Jessie Lite suffit pour nos besoins. Vous pouvez bien sûr utiliser NOOBS qui contient tout ce qu’il faut pour installer Raspbian ou une autre distribution de votre choix, mais je n’ai effectué aucun test avec une autre distribution.

https://www.raspberrypi.org/downloads/raspbian/

Je vous décris rapidement ma méthode d’installation du système d’exploitation. En cas de problème, vous trouverez facilement d’autres procédures plus détaillées sur Internet.

Pour créer ma carte SD, j’utilise Win32 Disk Imager.

clip_image002
clip_image004

Une fois que vous avez démarré Raspbian sur votre RPi, vous devez étendre la partition pour utiliser toutes l’espace disponible sur votre carte SD.

sudo raspi-config

Choisissez l’option “Expand Filesystem”, puis redémarrer.

Mettre à jour le système :

sudo apt-get update
sudo apt-get upgrade

 

Branchement du capteur :

image

Le Raspberry Pi 2 contient plus de pins, mais les mêmes sont utilisés pour ce montage, peu importe le modèle.

Un script en Python sera utilisé pour obtenir les lectures de température et d’humidité du capteur DHT11.  L’information est disponible sur le site web Adafruit :

https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/software-install-updated

sudo apt-get install build-essential python-dev python-openssl
sudo apt-get install git
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install
cd examples

Pour accéder aux données du capteur, le programme doit obligatoirement être exécuté en tant que ROOT.

sudo python AdafruitDHT.py 11 4

Le programme en Python prend en paramètre le modèle du DHT (11 dans ce cas-ci) et le numéro de la pin utilisée pour les données (4).

Le programme devrait afficher la température et l’humidité sur une ligne.

clip_image002[4]

 

Si tout est bien branché, nous pouvons passer à l’étape suivante qui consiste à rendre les données accessibles par SNMP.

On modifie d’abord le programme AdafruitDHT.py pour obtenir d’un programme distinct permettant d’obtenir indépendamment la valeur de la température et celle de l’humidité. Vous pouvez placer les programmes où vous désirez.  Dans mon exemple, je place tout dans \root, car de toute façon, nos scripts et programmes doivent s’exécuter en root.

Voici les deux fichiers à créer :

sudo nano /root/temperature.py

import sys
import Adafruit_DHT

sensor_args = { '11': Adafruit_DHT.DHT11,'22': Adafruit_DHT.DHT22,'2302': Adafruit_DHT.AM2302 }

if len(sys.argv) == 3 and sys.argv[1] in sensor_args:
    sensor = sensor_args[sys.argv[1]]
    pin = sys.argv[2]
else:
    print 'usage: sudo ./Adafruit_DHT.py [11|22|2302] GPIOpin#'
    print 'example: sudo ./Adafruit_DHT.py 2302 4 - Read from an AM2302 connected to GPIO #4'
    sys.exit(1)

humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

if humidity is not None and temperature is not None:
    print '{0:0.1f}'.format(temperature)
else:
    print 'Failed to get reading. Try again!'
    sys.exit(1)

 

sudo nano /root/humidity.py

import sys
import Adafruit_DHT

sensor_args = { '11': Adafruit_DHT.DHT11,'22': Adafruit_DHT.DHT22,'2302': Adafruit_DHT.AM2302 }

if len(sys.argv) == 3 and sys.argv[1] in sensor_args:
    sensor = sensor_args[sys.argv[1]]
    pin = sys.argv[2]
else:
    print 'usage: sudo ./Adafruit_DHT.py [11|22|2302] GPIOpin#'
    print 'example: sudo ./Adafruit_DHT.py 2302 4 - Read from an AM2302 connected to GPIO #4'
    sys.exit(1)

humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

if humidity is not None and temperature is not None:
    print '{0:0.1f}'.format(humidity)
else:
    print 'Failed to get reading. Try again!'
    sys.exit(1)

 

Si on teste les deux programmes, on devrait obtenir ceci :

root@raspberrypi:~# python temperature.py 11 4

23.0

root@raspberrypi:~# python humidity.py 11 4

33.0

 

Nous obtenons donc une simple valeur.  Il nous reste à créer un petit script pour simplifier l’utilisation en SNMP par la suite :

sudo nano /root/dhtsensor.sh

#!/bin/bash

if [ "$1" = "-t" ]
then
echo .1.3.6.1.4.1.333.1
echo gauge
python /root/temperature.py 11 4
fi

if [ "$1" = "-h" ]
then
echo .1.3.6.1.4.1.333.2
echo gauge
python /root/humidity.py 11 4
fi

exit 0

Ce qui donne comme résultat :

root@raspberrypi:~# sh dhtsensor.sh -t

.1.3.6.1.4.1.333.1

gauge

23.0

root@raspberrypi:~# sh dhtsensor.sh -h

.1.3.6.1.4.1.333.2

gauge

33.0

 

Il nous reste à intégrer le tout dans notre serveur SNMP.

On procède à l’installation du client et serveur SNMP :

sudo apt-get install snmpd snmp

Vous pouvez modifier la configuration du serveur SNMP ou simplement remplacer le fichier de configuration par celui que je vous propose :

sudo mv /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.bak
sudo nano /etc/snmp/snmpd.conf

agentAddress 161
view systemonly included .1.3.6.1.2.1.1
view systemonly included .1.3.6.1.2.1.25.1
rocommunity public default -V systemonly
rocommunity6 public default -V systemonly
rouser authOnlyUser
sysLocation Sitting on the Dock of the Bay
sysContact Me <me@example.org>
sysServices 72
proc mountd
proc ntalkd 4
proc sendmail 10 1
disk / 10000
disk /var 5%
includeAllDisks 10%
load 12 10 5
trapsink localhost public
iquerySecName internalUser
rouser internalUser
defaultMonitors yes
linkUpDownNotifications yes
master agentx
pass .1.3.6.1.4.1.333.1 /bin/sh /root/dhtsensor.sh -t
pass .1.3.6.1.4.1.333.2 /bin/sh /root/dhtsensor.sh –h

 

Il reste une modification à effectuer au niveau des droits du service SNMP.  En effet, par défaut, le service utilise l’usager “snmp”.  Celui n’a toutefois pas les droits nécessaires pour récupérer des valeurs du capteur.  Il est nécessaire d’exécuter le service en root.

Notez qu’il existe certainement une façon plus sécurité d’obtenir le même résultat, mais pour mon usage actuel, cela convient.

Pour ce faire, il faut modifier le fichier suivant :

sudo nano /etc/default/snmpd

Remplacer “–u snmp –g snmp” par “-u root –g root”.

On redémarre finalement le service SNMP :

sudo /etc/init.d/snmpd restart

 

On croise les doigts et on teste notre serveur SNMP :

root@raspberrypi:~# snmpwalk -Os -c public -v 1 localhost .1.3.6.1.4.1.333.1

iso.3.6.1.4.1.333.1 = Gauge32: 23

Error: OID not increasing: iso.3.6.1.4.1.333.1 >= iso.3.6.1.4.1.333.1

root@raspberrypi:~# snmpwalk -Os -c public -v 1 localhost .1.3.6.1.4.1.333.2

iso.3.6.1.4.1.333.2 = Gauge32: 33

Error: OID not increasing: iso.3.6.1.4.1.333.2 >= iso.3.6.1.4.1.333.2

 

 

Ne reste plus qu’à utiliser ces nouvelles données dans votre système de monitoring.  Personnellement, j’utilise PRTG :

Ajoutez un nouvel équipement (notre Raspberry Pi) :

image

Ajoutez un capteur SNMP (personnalisé) permettant de surveiller une valeur numérique.

image

Entrez le chemin OID et autres paramètres du capteur :

image

Répétez les mêmes étapes pour ajouter un capteur pour l’humidité.

Si tout fonctionne bien, vous aurez deux nouveaux capteurs dans votre interface :

image

 

Voici un graphique de la température à la sortie d’un climatiseur d’une salle informatique :

image

Extraire les pièces jointes d’un fichier EML

Voici un tout petit script Python que j’utilise régulièrement pour extraire les pièces jointes dans un fichier EML.

Très utile si vous avez un pare-feu qui vous met des courriels en quarantaine et vous permet de les récupérer en fichier EML.  Vous placez vos courriels suspects dans un dossier, puis vous exécutez le script.  Les pièces jointes seront extraites dans ce même dossier.  Vous aurez alors vos pièces jointes à analyser.

Je vous prépare pour bientôt un article sur mes outils d’analyses de malware favoris.

 import email
 import os

 path = './'
 listing = os.listdir(path)

 for fle in listing:
     if str.lower(fle[-3:])=="eml":
         msg = email.message_from_file(open(fle))
         attachments=msg.get_payload()
         for attachment in attachments:
              try:
                  fnam=attachment.get_filename()
                  f=open(fnam, 'wb').write(attachment.get_payload(decode=True,))
                  f.close()
               except Exception as detail:
                   #print detail
                   pass

The 4sysops PowerShell tutorial

Une petite mine d’or de scripts et de tutoriel sur le PowerShell.

Voici ma sélection personnelle parmi les scripts proposés par 4sysops :

System administration with PowerShell

Pour la liste complète, visitez 4sysops.com :
https://4sysops.com/archives/announcing-the-4sysops-powershell-tutorial/

Page de code/code page dans les scripts

Vous aurez remarqué que dans vos commandes en ligne ou dans vos scripts, si vous exportez la sortie dans un fichier, vos caractères accentués ne seront plus compréhensibles.

Par exemple, si vous exécutez simplement la commande “tasklist > process.txt”, vous obtiendrez un fichier texte contenant la liste des processus en cours qui ressemble à ceci :

Nom de l'image                 PID Nom de la sessio Num‚ro de s Utilisation 
========================= ======== ================ =========== ============
System Idle Process              0 Services                   0        24 Ko
System                           4 Services                   0     1ÿ452 Ko
smss.exe                       404 Services                   0     1ÿ204 Ko
csrss.exe                      680 Services                   0     5ÿ312 Ko
wininit.exe                    752 Services                   0     4ÿ932 Ko
csrss.exe                      772 Console                    1   112ÿ936 Ko
services.exe                   808 Services                   0    16ÿ504 Ko
lsass.exe                      824 Services                   0    21ÿ088 Ko
lsm.exe                        832 Services                   0     6ÿ816 Ko

 

En effet, la console Windows utilise encore la vieille page de code du DOS, soit le code de page 850 (CP850).  La solution consiste à toujours définir la bonne page de code avant d’exécuter des commandes dans une console ou dans un script.

Pour ce faire, tapez ou écrivez la commande suivante : “chcp 1252”.  Cette commande modifie la page de code en cours pour utiliser CP1252 (Windows-1252).  Les caractères s’affichent alors correctement :

Nom de l’image                 PID Nom de la sessio Numéro de s Utilisation 
========================= ======== ================ =========== ============
System Idle Process              0 Services                   0        24 Ko
System                           4 Services                   0     1 472 Ko
smss.exe                       404 Services                   0     1 204 Ko
csrss.exe                      680 Services                   0     5 316 Ko
wininit.exe                    752 Services                   0     4 932 Ko
csrss.exe                      772 Console                    1   118 112 Ko
services.exe                   808 Services                   0    16 552 Ko
lsass.exe                      824 Services                   0    21 096 Ko
lsm.exe                        832 Services                   0     6 820 Ko
svchost.exe                    944 Services                   0    11 504 Ko

 

Si vous avez des fichiers textes existants que vous aimeriez afficher correctement ou même modifier en conservant l’encodage CP850, vous pouvez utiliser un éditeur de texte plus avancé que Notepad.  Personnellement, j’aime bien Textpad qui me simplifie grandement la vie.  Vous pouvez alors simplement sélectionner le code à l’ouverture ou à l’enregistrement d’un fichier.

image

De plus, vous pouvez rapidement convertir le texte d’un format à l’autre à l’aide d’un simple copier-coller.