MDT – Techniques de gestion de la base de données

I. Présentation

Pour l'installation de la base de données MDT, vous pouvez vous reporter à mon tutoriel sur la gestion des applications. Vous y trouverez une procédure de mise en œuvre d'une base de données MDT.

Il se peut que vous rencontriez quelques difficultés lors de la déclaration de l'instance SQL, avec un symptôme du genre "impossible de trouver l'instance SQL". Ce phénomène peut être lié au fait que le service "SQL Browser" ne soit pas démarré. Pour y remédier, démarrez le programme "SQL Server Configuration Manager" puis développez l'arborescence "Configuration réseau SQL Server ... Protocoles pour SQLEXPRESS" (ou le nom de votre instance installée pour les besoins de MDT). Dans le cadre de droite, vérifiez que le protocole "Canaux nommés" ("Named Pipes")  est bien activé, conformément au choix de votre configuration MDT.

MDT05-img00a
SQL - Activation des protocoles réseau

Dans le cas contraire, modifiez ce réglage via le menu contextuel ou les propriétés du protocole.

Sélectionnez ensuite le nœud "Services SQL Server" puis accédez aux propriétés du service "SQL Server Browser". Vérifiez  que le service est bien démarré ou cliquez sur le bouton dans le cas contraire.

MDT05-img00b

Sélectionnez l'onglet "Service" puis choisissez "Automatique" dans le champ "Mode de démarrage".

MDT05-img00c

Cliquez sur "Appliquer" puis "OK". À ce stade, la déclaration de votre base de données MDT ne devrait plus poser de problème (du moins, en local...)

Pour votre gouverne, sachez que depuis MDT 2012, il est possible de créer une base de données et l'associer à MDT en ligne de commande Powershell, voici un exemple :

# Importer un module PowerShell
Import-Module "C:\Program Files\Microsoft Deployment Toolkit\Bin\MicrosoftDeploymentToolkit.psd1"
# Créer un nouveau lecteur
New-PSDrive -Name DS002 -PSProvider mdtprovider -Root E:\DeploymentShare
# Créer une base de données
New-MDTDatabase -SQLServer 'WDS-MDT' -Database 'MDT02' -Instance 'SQLExpress' -Path 'DS002:'

Pour afficher les commandes disponibles

Get-Command -Module MicrosoftDeploymentToolkit

Note : Avec MDT2010, le module n'existait pas et il fallait charger l'extension spécifique comme suit : "Add-PSSnapIn Microsoft.BDD.PSSnapIn"

Toutefois, à ma connaissance, il n’existe pas de technique pour configurer en ligne de commande, les règles de gestion de la base de données que nous allons évoquer ci-après. N'hésitez pas à commenter cet article si vous avez une piste à ce sujet. Pour les plus intéressés sur la configuration automatisée de MDT, je vous recommande la lecture de cet article de Rens Hollanders.

II. Rappels - Gestion de la base de données MDT

Pour ceux qui n’auraient jamais eu l'occasion d'utiliser une base de données au sein de MDT, voici quelques éléments de présentation.

A. Présentation

Dans la console MDT, sont regroupées sous la rubrique "Database", 4 tables (ou plus exactement les vues proposées) suivantes :

MDT014-img01
Rubrique "Database" du MDT

Ces vues permettent d'afficher les champs principaux sous la forme d'un tableau :

VuesNom des champs affichés (Colonnes)Propriétés/Variable MDT
ComputersID, Description, MAC Address, Asset Tag, Serial Number, UUIDAssetTag, UUID, SerialNumber, MACAddress
RolesID, RoleRole
LocationID, LocationDefaultGateway
Make and ModelID, Make, ModelMake, Model

Chaque enregistrement (ou entrée) dispose d'un identifiant unique "ID" logique (ou clé primaire) incrémenté pour chaque nouvel ajout dans la base de données.

La principale vue "Computers" permet de gérer les ordinateurs en leur affectant un identifiant "matériel" unique qui peut être :

identifiantChamps exposés (Colonnes)
MAC AddressL'adresse MAC ou adresse physique de carte réseau (Probablement, la plus utilisée ou la plus pratique du fait qu'elle est généralement inventoriée et connu dans la plupart des entreprises)
Serial NumberLe numéro de série de l'ordinateur. Le format n'est pas normalisé et varie d'un constructeur à l'autre
Asset TagLittéralement "le numéro d'inventaire" du fabricant. Ce numéro peut être mentionné par le fournisseur sur une étiquette complétée d'un code-barre et apposée sur le boitier du PC (L'option peut être payante).
UUIDCe numéro correspond à l'identifiant de la carte mère. Selon le même principe qu'une adresse MAC, il est unique et normalisé sous une forme hexadécimale :
DA812F8C-2F4F-AE6E-F480-003E8CFDE2B6Vous pouvez l'afficher en ligne de commande
"wmic csproduct get uuid"

 

B. Rattacher une base existante

Si vous désirez rattacher une base existante, vous pouvez utiliser le menu "Advanced Configuration … Database … New Database" de la console MDT.

MDT014-img02
Assistant de configuration de la base de données MDT - Réseau

Après avoir renseigné le nom du serveur et de l'instance SQL, cliquez sur le bouton "Next".

MDT014-img03
Assistant de configuration de la base de données MDT - Database

Au niveau de la dernière option "Use an existing database that already contains the required tables and views", sélectionnez la base désirée qui doit apparaitre dans la liste déroulante.

Vous n'avez pas besoin de renseigner la ressource partagée si vous avez installé la base SQL sur le serveur MDT.

Cette directive facultative (SQLShare = ) est censée préciser le dossier partagé sur le serveur SQL. Bien que distinct de la directive "SLshare", qui désigne la ressource partagée destinée à recevoir les journaux (logs), on peut affecter la même valeur à ces 2 propriétés dès lors que l'instance SQL et le MDT sont sur le même serveur.

Cliquez 2 fois sur le bouton "Next" puis sur "Finish".

Attention, le fait de raccrocher une base existante à votre MDT, ne met pas à jour le fichier de configuration "CustomSettings.ini". Pour cela, vous devrez utiliser le menu "Advanced Configuration … Database … Configure Database Rules" de la console MDT l'opération suivante, en ayant préalablement sauvegardé votre fichier de configuration.

Pour configurer les différentes règles de gestion des requêtes, vous pouvez vous reporter à mon tutoriel sur la gestion des applications

C. Créer / Afficher un enregistrement

Pour créer un nouvel enregistrement, sélectionnez la vue désirée, comme par exemple "Computers", puis cliquez sur le menu "Action … New" ou le menu contextuel.

MDT014-img04
Ajout d'une nouvel ordinateur dans la base de données MDT

L'adresse MAC doit être saisie avec le séparateur d'octet ":" et les lettres en majuscule. Notez que cette interface ne vérifie pas les doublons. Au besoin, reportez-vous au chapitre "Compléments" ci-après.

Astuce : Vous pouvez remarquer que le champ "description" est optionnel. Toutefois, j'ai personnellement pris l'habitude d'y renseigner le nom de l'ordinateur (OSDComputerName) afin de visualiser directement cette information sans recourir à l'onglet de détail.

Le module Powershell MDTDB présenté plus loin, permet de renseigner une description lors de la création d'une nouvelle entrée "New-MDTComputer" mais présente le défaut de ne pas permettre la modification de ce champ par la suite "Set-MDTComputer". Au besoin, reportez-vous au chapitre "Compléments" ci-après.

Après avoir saisi les informations requises, vous pouvez cliquer sur le bouton "Appliquer" pour créer l'enregistrement.

Lors de l’ouverture d’un enregistrement, vous disposez de plusieurs onglets, variables selon de type de vue choisi. Pour ne pas trop charger cette présentation, je n'évoquerais que l'onglet "Detail" (de la vue "Computers").

Sous cet onglet, vous pouvez consulter, et renseigner le cas échéant, toutes les propriétés (variables MDT) de votre choix. Celles-ci sont classées par thèmes mis en exergue par des titres sur fond bleu.

Titre
ADDS Settings
Bitlocker
ConfigMgr 2012 OSD
DHCP Server Settings
Disk Settings
Display Settings
DNS Server Settings
Domain and Workgroup
Identification
Miscellaneous
NIC Settings
OS Roles
Regional and Locale Settings
User Data
Wizard Control
Custom

Il y a potentiellement plus de 200 variables disponibles !...

(Get-MDTComputer |get-member -MemberType Properties ).count

En fonction de vos outils d'inventaire logiciels et matériel tel que SCCM, MAPT ou ACT, ou d'outils tiers tels que GLPI, OCS Inventory ou encore de tableaux Excel, le peuplement de la base de données du MDT peut s'avérer rapidement délicate ou fastidieuse.

Il devient donc rapidement évident qu'une technique de gestion de masse s'impose 😉

III. Gérer la base de données MDT via Powershell

En alliant les capacités intrinsèques de Powershell à des extensions spécifiques (appelée module) vous pouvez bénéficier d'un véritable arsenal de gestion de cette base de données MDT, et envisager rapidement des opérations d'extraction, de modification ou d'import en masse au travers de vos propres scripts.

Le snapin ou module "MicrosoftDeploymentToolkit.psd1" fournit par Microsoft et évoqué précédemment, est manifestement insuffisant pour une gestion des éléments contenus dans une base de données MDT. Heureusement, la communauté Powershell et MDT est très active et vous permet de pallier ces lacunes.

A. Télécharger et installer le module MDTDB

En premier lieu, vous devez télécharger le module spécifique à l'adresse suivante :

http://blogs.technet.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-03-24-15-04/MDTDB.zip

Une fois téléchargée, décompressez l'archive vers un dossier temporaire. Normalement, cette archive ne contient qu'un module Powershell "MDTDB.psm1" et un script d'exemple "MDTDB_Test.ps1".

Ces fichiers provenant d'un téléchargement Internet, pensez à vérifier les propriétés de ceux-ci  via l'explorateur Windows, puis cliquez sur le bouton "Débloquer" le cas échéant.

 

MDT014-img05
Débloquer un fichier téléchargé

Pour respecter les préconisations relatives aux modules, et les retrouver plus facilement, vous pouvez copier ou déplacer le fichier .psm1 vers le dossier "%windir%\System32\WindowsPowerShell\v1.0\Modules\MDTDB".

Pour vérifier la disponibilité des différents modules dans votre environnement, vous pouvez utiliser la commande Powershell suivante :

($env:PSModulePath).Split(';') |dir | ft name

Vous devriez voir apparaître le module MDTDB dans cette liste.

B. Utilisation du module MDTDB

Ouvrez une console Powershell, en tant qu'Administrateur.

Avant de poursuivre, vous devez vérifier que la stratégie d'exécution autorise l'exécution des scripts qui ne sont pas signés numériquement. Entrez la commande suivante pour autoriser l'exécution locale du module non signé.

Set-ExecutionPolicy RemoteSigned

Entrez la commande suivante afin d'obtenir le liste des modules disponibles.

Get-Module -ListAvailable

Le module "MDTDB" devrait apparaitre dans la liste. Cependant, si vous ne l’avez pas placé à l’endroit indiqué précédemment, vous pouvez également le charger à partir de son emplacement initial, en stipulant son chemin complet.

Bien que facultatif depuis Powershell v3 grâce au chargement automatique des modules, vous devez entrer la commande suivante afin de charger les fonctions dans la session courante.

Import-Module MDTDB

Pour afficher la liste des fonctions apportées par ce module, tapez la commande suivante.

Get-Command -Module MDTDB

Vous pouvez constater que la liste est longue (72 commandes, plus exactement des fonctions) et nous allons porter notre attention uniquement sur les principales fonctions :

La première action primordiale consiste à établir une connexion avec la base de données du serveur MDT en procédant comme suit:

Connect-MDTDatabase –sqlServer WDS-MDT –instance SQLEXPRESS -database MDT01

Si la base contient déjà des ordinateurs référencés, vous pouvez en obtenir la liste via la fonction suivante :

Get-MDTComputer

Comme vous l'avez constaté préalablement, un ordinateur MDT est référencé au sein de la base de données par un ou plusieurs identificateurs distinctifs. La commande précédente permet d'affiner la recherche en stipulant des paramètres suivants :

ParamètreDescription
-idIdentifiant unique de l'ordinateur dans la base de donnée
s-assetTagNuméro de modèle lié à un fabriquant
-macAddressAdresse physique de la carte réseau
-serialNumberNuméro de série de l'ordinateur
-uuidIdentifiant unique de la carte mère de l'ordinateur

Comme vous pouvez le constater, chaque enregistrement possède un nombre considérable de variables (~225) retournées sous forme de liste, et de fait difficilement exploitable à l'affichage.

Note : La seule variable positionnée par défaut sur une nouvelle entrée d'ordinateur est "OSInstall = YES"

Pour obtenir un tableau simplifié des ordinateurs référencés dans la base de données, utilisez la commande suivante :

Get-MDTComputer | Format-Table Id, AssetTag, MacAddress, SerialNumber, UUID, OSDComputerName -Autosize

Pour une présentation plus sympathique du résultat sous forme graphique vous pouvez également utiliser la commande suivante:

Get-MDTComputer | select-object -property OSDComputerName, Id, AssetTag, MacAddress, SerialNumber, UUID | sort-object -property OSDComputerName | out-gridview

Pour supprimer une entrée dans la base de données, vous devez connaitre son identifiant et utiliser la commande suivante (où "n" est l'identifiant) :

Remove-MDTComputer -id n

Pour supprimer une entrée dans la base de données, dont vous ne connaissez qu'une propriété telle que le nom, vous pouvez utiliser la commande suivante :

Get-MDTComputer | where { $_.OSDComputerName -match 'Test01' } | Remove-MDTComputer

L'opération de création ou de modification d'une entrée est sensiblement plus délicate. En effet, ces paramètres et leurs valeurs respectives doivent être renseignées au sein d'une table associative (hashtable) symbolisée par " @ { param1 = valeur1 ;  param2 = valeur2 } ".

Par exemple, pour créer un nouvel enregistrement, tapez la commande suivante :

New-MDTComputer -macAddress '00:00:00:11:22:33' -settings @{ OSInstall='YES' ; OSDComputerName='Test002' }

 

Note : Cette commande de création nécessite de déclarer au moins une propriété (-settings ) .

Pour Modifier un enregistrement existant, tapez la commande suivante :

Set-MDTComputer -id n -settings @{ OSDComputerName = 'Test003' }

Avant de manipuler efficacement cette base de données, vous devez donc identifier le nom des variables que vous souhaitez exploiter. Vous pouvez obtenir une liste exhaustive des noms de ces variables (ou propriétés) en interrogeant les propriétés d'une entrée existante (n), comme suit :

Get-MDTComputer -id n | Get-Member -MemberType Property | Select-Object Name

Un des nombreux atouts de PowerShell est sa capacité à convertir facilement des résultats vers des formats CSV, HTML, ou XML. Pour générer un fichier directement exploitable par votre tableur favori, il suffit de taper la commande suivante:

Get-MDTComputer | Export-Csv -Path C:\Temp\MyMDT.csv -Delimiter ';'

Réciproquement, si vous souhaitez importer un tableau CSV dans cette base de données, vous devez utiliser la commande "Import-CSV". Pour décomposer la procédure, tapez les commandes suivantes :

$Machines = Import-CSV -Path C:\Temp\MyMDT.csv -Delimiter ';'

À ce stade la variable "$Machines" contient l'intégralité du fichier CSV et vous pouvez afficher le nombre d'enregistrements comme suit

$Machines.count

 

Petit piège : J'ignore encore d'où vient ce phénomène, mais lorsqu'il n'y a qu'une seule entrée dans cet objet, la commande "$Machines.count" ne renvoie rien et non "1", comme on pourrait s'y attendre.

Chaque ligne de ce tableau correspond à un élément où chaque champ est une propriété de celui-ci. Autrement dit, en indiquant le numéro d'index (de 0 à "count-1") d'un élément suivi du nom de la propriété vous en obtenez la valeur, comme par exemple:

$Machines[0].id $Machines[0].OSDComputerName

À présent, vous pouvez envisager de réaliser une importation de masse. Pour des raisons de simplicité, nous utiliserons le fichier CSV suivant réduit à quelques propriétés (voir fichier d'exemple ci-dessous) :

Nous allons également créer quelques rôles factices, censés correspondre aux séquences de déploiement des différentes images de référence.

New-MDTRole -name 'Poste Fixe W7x64Pro' -settings @{ TaskSequenceID="REF-FIXE01" } 
New-MDTRole -name 'Poste Portable W7x64Ent' -settings @{ TaskSequenceID="REF-PORT01" }
New-MDTRole -name 'Poste Virtuel W7x86Pro' -settings @{ TaskSequenceID="REF-VIRT01" }

 

Du fait qu'il n'y a aucun contrôle sur la validité des réglages, comme ici "TaskSequenceID", faites attention aux erreurs de saisie, lors de vos traitements de masse.

Fichier d'exemple "MDTImport.CSV"

Name;Mac;OU;Role
PC-001;00:15:5D:64:33:01;Fixes;Poste Fixe W7x64Pro
PC-002;00:15:5D:64:33:02;Fixes;Poste Fixe W7x64Pro
PC-003;00:15:5D:64:33:03;Fixes;Poste Fixe W7x64Pro
PC-004;00:15:5D:64:33:04;Portables;Poste Portable W7x64Ent
PC-005;00:15:5D:64:33:05;Portables;Poste Portable W7x64Ent
PC-006;00:15:5D:64:33:06;Fixes;Poste Fixe W7x64Pro
PC-007;00:15:5D:64:33:07;Fixes;Poste Fixe W7x64Pro
PC-008;00:15:5D:64:33:08;Fixes;Poste Fixe W7x64Pro 
PC-009;00:15:5D:64:33:09;Fixes;Poste Fixe W7x64Pro
PC-010;00:15:5D:64:33:0A;Virtuels;Poste Virtuel W7x86Pro

Cet exemple ne traite pas la création des unités d'organisation "OU" et le nom du domaine. "ou=Postes,dc=labs,dc=local"

Exemple de script "ImportDB.ps1"

# Saisie du nom du fichier CSV d'import
param ( [string]$Path )

Do {
  if ($Path -eq "" -or -not(Test-Path $Path)) { 
  $Path = Read-Host "Entrez un nom de fichier CSV valide ou rien pour quitter "
  }
  if ($Path -eq "") {exit}
} Until (Test-Path $Path)

$Context = "ou=Postes,dc=labs,dc=local"
$sqlServer = "WDS-MDT"
$instance = "SQLEXPRESS"
$mdtdb = "MDT02"

# Import du module spécialisé MDTDB
Import-Module MDTDB

# Connexion à l'instance de la base de données MDT
Connect-MDTDatabase -sqlServer $sqlServer -instance $instance -database $mdtdb

# Chargement du fichier CSV
$machines = Import-Csv $Path -delimiter ';'

#Boucle de traitement des lignes du fichier CSV
For ($i=1; $i -le $machines.count; $i++)
{
   # Création d'une nouvelle entrée dans la base
   New-MDTComputer -macAddress $machines[$i-1].mac `
		   -description "$($machines[$i-1].name) : Demo Import DB" `
		   -settings @{ OSInstall='YES'; `
				OSDComputerName=$machines[$i-1].name; `
				ComputerName=$machines[$i-1].name; `
				MachineObjectOU="ou=$($machines[$i-1].OU),$Context";
		       	      }

   # Récupération de la clé "Id" de la nouvelle entrée
   $Current = get-mdtcomputer -macAddress $machines[$i-1].mac
   write-host "Création de $($machines[$i-1].name) avec Id: $($Current.id)"

   # Ajout du role (applications) s'il existe
   If ($machines[$i-1].role -ne "") { 
     Set-MDTComputerRole $Current.id $machines[$i-1].role 
     }
}

 

Dans une session Powershell, à partir du dossier dans lequel vous avez enregistré les 2 exemples précédents, exécutez le script comme suit:

.\ImportDB.ps1 .\MDTImport.csv

Pour vérifier le résultat, vous devez actualiser l'affichage dans la console MDT en sélectionnant la vue "Computers".

MDT014-img06
Base de données MDT - Vue "Computers"

Ouvrez l'une des entrées, puis sélectionnez l'onglet "Details". Vous deviez constater la présence des variables définies par le script.

MDT014-img07
Détails d'une entrée dans la base de données MDT

Et sous l'onglet "Role", le rôle correspondant devrait également être présent.

MDT014-img08
Association d'un rôle dans la base de données MDT

Pour conclure sur cette introduction à l'usage de MDTDB avec Powershell voici 2 petits exemples :

Exemple d'affichage des données renseignées

Get-MDTComputer | % { $_.OSDComputerName, $_.MACAddress, $_.MachineObjectOU, $(Get-MDTComputerRole($_.id)).Role }

Exemple de sortie dans un tableau graphique

Get-MDTComputer | Select *ComputerName, MACAddress | Out-Gridview

Vous pouvez bien évidement adapter cet exemple en stipulant les propriétés de votre choix au niveau de la commande "Select ...".

 

IV. Utiliser Excel avec la base de données MDT

Si les scripts vous rebutent un peu et que vous disposez d'un tableur tel que Excel, vous pouvez l'utiliser comme interface de la base de données MDT, pour par exemple effectuer des exportations ou des tris.

À partir d'Excel 2010 par exemple, sélectionnez l'onglet "Données" puis cliquez sur "Connexion" ... "Provenance : SQL Server"

MDT014-img09

Entrez ensuite le nom du serveur et l'instance SQL, telle que "wds-mdt/SQLExpress"

MDT014-img10

Cliquez sur "Suivant". Sélectionnez votre base MDT dans la liste déroulante.

MDT014-img12

 

Choisissez une table telle que "ComputerSettings" correspondant à la table des ordinateurs MDT, puis cliquez sur "Suivant"

MDT014-img11.

 

Ajoutez une éventuelle description puis cliquez sur "Terminer"

Vous êtes ensuite invité à importer les données dans un classeur Excel.

MDT014-img13

Pour une simple analyse, conservez le choix "Tableau" puis cliquez sur "OK". Le tableau fera toutefois plus de 200 colonnes !...

MDT014-img14

Si vous connaissez un peu le maniement d'Excel, je vous conseille de choisir la seconde option "Rapport de tableau croisé dynamique", afin de choisir la disposition des informations à analyser.

V. Compléments

À l'usage, vous éprouverez peut-être le besoin d'accéder à la base de données du MDT via des outils personnalisés, ou vos propres scripts. Voici donc quelques exemples pour commencer l'aventure...

A. MDT Administrator

Pour une gestion personnalisée de la base de données MDT, je vous conseille de jeter un œil sur l'outil "MDT Administrator" de Chris W. (Téléchargeable au format .exe ou .hta).

MDT05-img15
MDT Administrator

Si vous avez mis en place les rôles, comme mentionné dans ce tutoriel, l'usage de cet outil vous paraitra très rapidement évident. 🙂

B. Le champ "Description"

Lors de l'usage du module MDTDB précité, vous constaterez que le champ "Description" proposé lors de la création d'un nouvel ordinateur (New-MDTComputer) n'est plus disponible dans les commandes de modification (Set-MDTComputer). Cela est lié au fait que ce champ est stocké dans la table principale des ordinateurs (dbo.ComputerIdentity) référencée par la première commande et non celle des variables associées (dbo.ComputerSettings) sur laquelle agit la seconde commande.

Voici un petit exemple de script Powershell destiné à modifier le champ "Description" d'un ordinateur MDT dont vous connaissez l'identifiant.

Note : J'ai ajouté une petite fonction pour la gestion de la base de données afin que ce script soit indépendant du module MDTDB.

Set-MDTDescription.ps1

Function Invoke-SqlCommand {
param (
    [string]$dataSource,  # = SQLServer\. ou SQLServer\Instance
    [string]$database,
    [string]$sqlCommand = $(throw "Merci de spécifier une requete.")
 )

$connectionString = "Provider=sqloledb; " +
                    "Data Source=$dataSource; " +
                    "Initial Catalog=$database; " +
                    "Integrated Security=SSPI;"

$connection = New-Object System.Data.OleDb.OleDbConnection $connectionString
$command = New-Object System.Data.OleDb.OleDbCommand $sqlCommand,$connection
$connection.Open()

$adapter = New-Object System.Data.OleDb.OleDbDataAdapter $command
$dataset = New-Object System.Data.DataSet
[void]$adapter.Fill($dataSet)
$connection.Close()

$dataSet.Tables # | Select-Object -Expand Rows
}

function Read-Default($text, $defaultValue) { 
  $prompt = Read-Host "$($text) [$($defaultValue)]"; return ($defaultValue,$prompt)[[bool]$prompt]; 
  } 

$SQLServer= "WDS-MDT"
$Instance = "SQLExpress"
$Database = "MDT02"

$ID = Read-Host "Entrez l'identifiant de l'ordinateur MDT"   

  
$MDTComputer = Invoke-SqlCommand -sqlCommand "SELECT * FROM ComputerIdentity `
   WHERE ID = '$ID'" -dataSource "$SQLServer\$Instance" -database "$Database" 
if ($MDTComputer -ne $null) {
  echo $MDTComputer
  
  $NewDescription = Read-Default -text "Modifier ? (Entrée sinon)" -defaultValue "$($MDTComputer.Description)"
  if ($NewDescription -ne $($MDTComputer.Description)) {
     Invoke-SqlCommand -sqlCommand "UPDATE ComputerIdentity SET Description = '$NewDescription'`
       WHERE ID = '$ID'" -dataSource "$SQLServer\$Instance" -database "$Database"
      echo "La description [$NewDescription] a été mise à jour sur l'entrée $ID"
      } else {
      echo "La description [$NewDescription] n'a pas été modifiée sur l'entrée $ID"
      }
   } 
   else {
  echo "Entrée N°$ID inexistante dans la base de données $Database"
}

 

C. Valider le format d'adresse MAC et son unicité

Voici un autre exemple de script Powershell destiné à valider le format d'une adresse MAC et tester son unicité dans la base de données.

CheckMAC.ps1

Function Invoke-SqlCommand {
param (
    [string]$dataSource,  # = SQLServer\. ou SQLServer\Instance
    [string]$database,
    [string]$sqlCommand = $(throw "Merci de spécifier une requete.")
 )

$connectionString = "Provider=sqloledb; " +
                    "Data Source=$dataSource; " +
                    "Initial Catalog=$database; " +
                    "Integrated Security=SSPI;"

$connection = New-Object System.Data.OleDb.OleDbConnection $connectionString
$command = New-Object System.Data.OleDb.OleDbCommand $sqlCommand,$connection
$connection.Open()

$adapter = New-Object System.Data.OleDb.OleDbDataAdapter $command
$dataset = New-Object System.Data.DataSet
[void]$adapter.Fill($dataSet)
$connection.Close()

$dataSet.Tables # | Select-Object -Expand Rows
}

Function CheckMac {
   param (
       [string]$MACAddress = $(throw "Merci de spécifier une adresse MAC.")
   )  
	$patterns = @(
		'^([0-9a-f]{2}:){5}([0-9a-f]{2})$'
		'^([0-9a-f]{2}-){5}([0-9a-f]{2})$'
		'^([0-9a-f]{4}.){2}([0-9a-f]{4})$'
		'^([0-9a-f]{12})$')
 	if ($MACAddress -match ($patterns -join '|')) {$true} else {
   			Echo "ERREUR: Le format d'adresse MAC specifié est invalide : $MACAddress"
   	return
   	}
  	$Delimiter = ':'
  	$rawAddress = $MacAddress -replace '\W'
  	switch ($Delimiter) {
  		{$_ -match ':|-'}	{    
			if ($MacAddress -match ":")   {
   				$result=$MacAddress
   				Echo "L'adresse MAC $MacAddress est déjà au bon format" 
				}
 			else  {
    			for ($i = 2 ; $i -le 14 ; $i += 3) {
    				$result = $rawAddress = $rawAddress.Insert($i, $_)
					}
    			Echo "L'adresse MAC saisie $MacAddress a été convertie en $result" }
   				break
 			}
  		'.' {  for ($i = 2 ; $i -le 14 ; $i += 3) {
  				$result = $rawAddress = $rawAddress.Insert($i, $_) }
  				Echo "L'adresse MAC saisie $MacAddress a été convertie en $result"
  				break
 			}
		} # End switch
  	$MACAddress=$result.toUpper()
  	$global:MAC = $MACAddress
  	
}


CheckMac(read-host "Entrez l'adresse MAC à vérifier ")


# Vérification d'unicité

    $SQLServer= "WDS-MDT"
 	$Instance = "SQLExpress"
	$Database = "MDT02"
  
	$DuplicateMAC = Invoke-SqlCommand -sqlCommand "SELECT * FROM ComputerIdentity WHERE macAddress `
          = '$MAC'" -dataSource "$SQLServer\$Instance" -database "$Database" 
	
    if ($DuplicateMAC -ne $null){
		Echo "Cette adresse MAC $MAC est déjà assignée ! cf ID N° $($DuplicateMAC.ID)"
		} 
	else {
	    Echo "L'adresse MAC $MAC n'est pas encore assignée." 
	 }

Extraits de mes différents projets, j'ai essayé de rendre ces extraits autonomes, sans m'attarder sur la qualité du code, mais l'idée est bien là et je vous laisse le soin de les adapter à vos besoins.

Bien à vous

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Christophe Mandin

Consultant/Formateur indépendant en quête de solutions et de moyens alliant efficacement la théorie et la pratique. Fort d’une expérience de plusieurs dizaines années dans l’informatique, j’ai pu apprécier de nombreuses problématiques, développer des qualités rédactionnelles et un esprit de synthèse, tout en me forgeant de solides fondamentaux théoriques, indispensables à toute analyse et mise en œuvre fonctionnelle. Malgré toutes ces années, je ne me lasse pas du plaisir de transmettre mes connaissances en misant sur 3 critères que sont les fondamentaux, la simplicité et le pragmatisme.
Bien à vous. Retrouvez-moi sur Viadeo et LinkedIn : Christophe Mandin

    cnf1g a publié 32 articles sur IT-Connect.See all posts by cnf1g

    Laisser un commentaire

    Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *