PI Services

Le blog des collaborateurs de PI Services

Utilisation des Windows forms .Net via Powershell sous WinPE 4

Depuis WinPe 4, il est possible d’utiliser des forms issues du .net via Powershell.

Pour cela, il faut rajouter à votre image wim des packages issues de l’adk.

Monter tout d’abord votre image wim

imagex64.exe /mountrw c:\winpe4_x86\media\sources\boot.wim 1 c:\winpe4_x86\mount

clip_image002

clip_image003

Installation du 1er Package: Netfx4

dism /image:c:\winpe4_x86\mount /add-package /packagepath:"C:\Program Files (x86)\Windows Kits\8.0\Assessment and Deployment Kit\Windows Preinstallation Environment\x86\WinPE_OCs\winpe-netfx4.cab"

clip_image005

Installation du 2nd Package: Powershell3

dism /image:c:\winpe4_x86\mount /add-package /packagepath:"C:\Program Files (x86)\Windows Kits\8.0\Assessment and Deployment Kit\Windows Preinstallation Environment\x86\WinPE_OCs\winpe-powershell3.cab"

clip_image007

Une fois ceux ci installé, démonté votre image wim.

imagex64.exe /unmount c:\winpe4_x86\mount /commit

Démarrer maintenant sur votre PE.

clip_image009

Et là, nous allons lancer un exemple de script ps1 faisant appel à une interface graphique apporté par le Framework .NET.

clip_image011

Nous pouvons donc imaginer en remplacement du HTA, une interface faisant appel aux Forms pour l’élaboration d’un Master par exemple.

Client http sous Powershell

A l’image de Wget qui est un client http, nous pouvons faire appel en powershell à un objet qui permettra donc d’effectuer des requêtes depuis des Urls. Pour cela, il faut utiliser un objet particulier : system.net.webclient

Regardons maintenant certaines propriétés qu’il propose :

(new-object system.net.webclient) | gm

clip_image001

Maintenant, imaginons que nous disposons d’une Url nous retournant un résultat formaté en fichier type csv (séparateur : virgule) nous renvoyant des informations que nous désirons récupérés dans nos scripts, il suffit pour cela de télécharger via la méthode DownloadFile les informations dans un fichier. Et ensuite d’importer ce fichier dans une variable.

Exemple:

$client=new-object system.net.webclient

$url="http://AppelUrl.local"

$path="c:\test\DataUrl.txt"

$client.DownloadFile ($url, $path)

$csv=Import-Csv $path -header intitulé,Process

clip_image002

A partir de là, nous pouvons facilement exploiter les données reçues par l’url.

Récupérer les paramètres Firefox quel que soit la version par USMT

Vous souhaitez récupérer via l’outil USMT les favoris Firefox.

Cependant depuis quelques temps, le nombre de versions de Firefox a augmenté de façon importante.

Pour supporter l’ensemble des versions de Firefox, ouvrez donc le fichier xml MigApp de USMT.

Identifiez la partie consacrée à Firefox

<!-- Mozilla Firefox 3 -->

<component context="UserAndSystem" type="Application">

<displayName _locID="migapp.firefox3">Mozilla Firefox</displayName>

<environment name="GlobalEnv"/>

<environment name="GlobalEnvX64"/>

<role role="Settings">

<detection>

<conditions>

<condition>MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Mozilla\Mozilla Firefox 3.*\bin [PathToExe]")</condition>

</conditions>

</detection>

<rules context="User">

<destinationCleanup>

<objectSet>

<pattern type="File">%CSIDL_LOCAL_APPDATA%\Mozilla\Firefox\Profiles\*\Cache\* [*]</pattern>

</objectSet>

</destinationCleanup>

<include>

<objectSet>

<pattern type="File">%CSIDL_APPDATA%\Mozilla\Firefox\* [*]</pattern>

<pattern type="File">%CSIDL_LOCAL_APPDATA%\Mozilla\Firefox\Profiles\* [*]</pattern>

</objectSet>

</include>

<exclude>

<objectSet>

<pattern type="File">%CSIDL_APPDATA%\Mozilla\Firefox\Crash Reports\* [*]</pattern>

<pattern type="File">%CSIDL_APPDATA%\Mozilla\Firefox\Profiles\*\ [pluginreg.dat]</pattern>

<pattern type="File">%CSIDL_LOCAL_APPDATA%\Mozilla\Firefox\Profiles\*\Cache\* [*]</pattern>

</objectSet>

</exclude>

<merge script="MigXmlHelper.SourcePriority()">

<objectSet>

<pattern type="File">%CSIDL_APPDATA%\Mozilla\Firefox\* [*]</pattern>

<pattern type="File">%CSIDL_LOCAL_APPDATA%\Mozilla\Firefox\Profiles\* [*]</pattern>

</objectSet>

</merge>

</rules>

</role>

</component>

Pour supporter l’ensemble des versions de Firefox, il suffit de modifier un seul caractère correspondant à la version par le caractere « * » à la ligne correspondant à :

<condition>MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Mozilla\Mozilla Firefox 3.*\bin [PathToExe]")</condition>

Exemple :

<!-- Mozilla Firefox -->

<component context="UserAndSystem" type="Application">

<displayName _locID="migapp.firefox3">Mozilla Firefox</displayName>

<environment name="GlobalEnv"/>

<environment name="GlobalEnvX64"/>

<role role="Settings">

<detection>

<conditions>

<condition>MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Mozilla\Mozilla Firefox *.*\bin [PathToExe]")</condition>

</conditions>

</detection>

<rules context="User">

<destinationCleanup>

<objectSet>

<pattern type="File">%CSIDL_LOCAL_APPDATA%\Mozilla\Firefox\Profiles\*\Cache\* [*]</pattern>

</objectSet>

</destinationCleanup>

<include>

<objectSet>

<pattern type="File">%CSIDL_APPDATA%\Mozilla\Firefox\* [*]</pattern>

<pattern type="File">%CSIDL_LOCAL_APPDATA%\Mozilla\Firefox\Profiles\* [*]</pattern>

</objectSet>

</include>

<exclude>

<objectSet>

<pattern type="File">%CSIDL_APPDATA%\Mozilla\Firefox\Crash Reports\* [*]</pattern>

<pattern type="File">%CSIDL_APPDATA%\Mozilla\Firefox\Profiles\*\ [pluginreg.dat]</pattern>

<pattern type="File">%CSIDL_LOCAL_APPDATA%\Mozilla\Firefox\Profiles\*\Cache\* [*]</pattern>

</objectSet>

</exclude>

<merge script="MigXmlHelper.SourcePriority()">

<objectSet>

<pattern type="File">%CSIDL_APPDATA%\Mozilla\Firefox\* [*]</pattern>

<pattern type="File">%CSIDL_LOCAL_APPDATA%\Mozilla\Firefox\Profiles\* [*]</pattern>

</objectSet>

</merge>

</rules>

</role>

</component>

SQL Server – Script Table Row Count in a Database

Ce script très utile pour des travaux d’inventaire ou de statistiques, permet de compter le nombre de lignes que disposent les tables d’une base de données :

USE [DB]
GO
SELECT OBJECT_NAME(OBJECT_ID) TableName, st.row_count
FROM sys.dm_db_partition_stats st
WHERE index_id < 2
ORDER BY st.row_count DESC
GO

Powershell: Générateur de Mot-de-passe

Il arrive souvent dans le cadre de migration ou de création de nouvelle forêt/Domaine Active Directory, de générer des nouveau mots de passe pour les nouveau comptes. Afin d’automatiser cette opération, le PowerShell nous permet de scripter cette étape et de la faire correspondre à la stratégie de mot-de-passe mise en œuvre.

Voici un exemple de fonction qui permet de générer des mots-de-passe correspondant à la stratégie par défaut (complexité et 8 caractères):

#============================================
# Fonction de création de Password aléatoire   
#============================================
function RandomPassword ([int]$intPasswordLength)
       {
          if ($intPasswordLength -lt 4) {return "password cannot be <4 chars"}   # -lt inférieur à
             
          $strNumbers = "1234567890"
          $strCapitalLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
          $strLowerLetters = "abcdefghijklmnopqrstuvwxyz"
          $strSymbols = "@-?!#"
          $rand = new-object random
 
          for ($a=1; $a -le $intPasswordLength; $a++)  #inférieur -le inférieur ou égal à
               {
                    if ($a -gt 4) #supérieur à
                       {
                             $b = $rand.next(0,4) + $a
                             $b = $b % 4 + 1
                       } else { $b = $a }
                    switch ($b)
                       {
                             "1" {$b = "$strNumbers"}
                             "2" {$b = "$strCapitalLetters"}
                             "3" {$b = "$strLowerLetters"}
                             "4" {$b = "$strSymbols"}
                       }
                    $charset = $($b)
                    $number = $rand.next(0,$charset.Length)
                    $RandomPassword += $charset[$number]
               }
          return $RandomPassword
       }
 
#######################
# PROGRAMME PRINCIPAL
#######################
                # Génération aléatoire du Password en lançant la fonction définie précédemment                 
             RandomPassword 8
              

Il suffit de modifier le programme principal pour générer des mots-de-passe plus longs. Il ne reste plus qu’à intégrer et appeler la fonction dans un script global de création des comptes Active Directory.

PowerShell : Ajout d’entrée DNS

Dans le cadre d’installation de certaines plateformes, il est parfois nécessaire de créer de nombreuses entrées DNS.

Pour réaliser cette opération, l’interface graphique peut s’avérer fastidieuse et source d’erreurs. Il peut donc être intéressant de réaliser quelques commandes pour réaliser ces ajouts :

Pour cela, les entrées DNS à créer peuvent être stockées dans un fichier csv comme ici dans le cadre de Lync Server:

image

Une fois le fichier construit, il suffit de le parser et de construire la commande dnscmd:

   1:  $file=import-csv C:\sources\dnslync.csv -Delimiter ";"
   2:   
   3:  foreach ($entry in $file)
   4:  {
   5:     dnscmd v-DNS-01 /recordAdd mazone.org $entry.Host $entry.type $entry.IP
   6:  }

L’exécution confirme la création des entrées:

image

Les entrées sont ainsi créées dans la zone précisée.

SQL Server 2008 R2 – Erreur 7399 lors de la liaison d’un serveur SQL local à un serveur SQL distant

Problème :

Lors de la liaison d’un serveur SQL à un autre le message d’erreur suivant s’affiche" :

3_thumb2

Le fournisseur OLE DB “SQLNCLI10” du serveur lié “xxx” a rapporté une erreur. Echec de l’authentification.

Impossible d’initialiser l’objet de la source de données du fournisseur OLE DB “SQLNCLI10” du serveur lié “xxx”

Le fournisseur OLE DB “SQLNCLI10” du serveur lié “xxx” a retourné le message “Spécification d’autorisation non valide”. (Microsoft SQL Server, Erreur : 7399)

Cause :

Les principales causes sont les suivantes :

  • Le problème peut être lié au réseau, par exemple vouloir lié deux serveurs qui sont dans deux VLANs différents.
  • Il peut s’agir également d’un problème de configuration au niveau de l’authentification.
    Résolution :

Nous commençons par vérifier si les serveurs arrivent à communiquer entre eux en les pingant afin d’écarter un problème qui pourrait être lié au réseau. Une fois ce problème résolue, nous pouvons passer à la liaison de nos serveurs.

    Nous poursuivons ensuite par la configuration de la liaison entre les serveurs. Nous naviguons jusqu’au dossier Objets serveur du volet droit de navigation puis faisons un clic-droit sur Serveurs liés afin de commencer notre configuration.
    6_thumb
    Nous entrons le nom du serveur SQL que nous voulons lier et nous choisissons SQL Serveur comme type de serveur :

7_thumb4

Nous poursuivons avec l’onglet Sécurité, ou nous définissons un utilisateur qui appartient au serveur que nous voulons lier pour faire notre mappage de connexions entre les deux serveurs.

Enfin nous choisissons le contexte de sécurité “Seront effectuées dans le contexte de sécurité de la connexion actuelle” de notre liste puis validons la configuration en cliquant sur OK.

2_thumb11

Nous avons désormais lié notre serveur SQL local à notre serveur SQL distant tout en assurant la sécurité de notre environnement.

Windows Server 2008 R2: Impossible d’activer la découverte de réseau !!!

 

Problème

Si vous essayez d’activer la découverte réseau sur un serveur Windows Server 2008 R2 vous n’y arrivez pas, la découverte est automatiquement désactivée dès que vous sortez de la page Modifier les options de partage pour d’autres profils réseau  

image

Résolution

La découverte du réseau et depuis la version Windows Vista utilise les 3 fournisseurs NetBIOS Provider, SSDP Provider et WS-Discovery (WSD) Provider qui ont été regroupés avec d’autres fournisseurs comme Registery Provider, PnP Provider et Third Party Providers dans une plateforme de découverte commune connu sous le nom de Function Discovery Plateform, cette plateforme fait appel aux services Windows suivants pour assurer ces fonctions :

  • Computer Browser (Explorateur d’ordinateurs)
  • SSDP Discovery (Découvert SSDP)
  • UPnP Device Host (Hôte de périphériques UPnP)
  • Registry
  • Function Discovery Resource Publication (Publication de ressource de découverte de fonctions)
  • Function Discovery Provider Host(Hôte du fournisseur de découverte de fonctions)
  • Link-Layer Topology Mapper(Mappage de découverte de topologie de la couche de liaison)
    Parmi les services cités il faudra s’assurer du démarrage des services :
  • Function Discovery Resource Publication (Publication de ressource de découverte de fonctions)
  • SSDP Discovery (Découvert SSDP)
  • UPnP Device Host (Hôte de périphériques UPnP)

Pour que l’activation de la découverte du réseau puisse fonctionner correctement.   

SQL Server : Erreur 4861 lors d’une opération BULK INSERT

Introduction

Dans le cadre d’une opération d’insertion en batch en utilisant la commande BULK INSERT sur un serveur de base de données SQL Server on peut être confronté à une erreur système d’exploitation indiquant qu’un problème d’ouverture du fichier source à cause d’un Accès refusé bloque l’exécution de l’opération.

image

image

Il faudra noter que l’exécution de la même requête sur le serveur SQL lui même ne génère par cette erreur mais s’exécutera sans aucun problème.  

Causes

Le fait que la requête s’exécute convenablement depuis le serveur de base de données lui et pas depuis une autre machine ou un poste client, exclu automatiquement le fait que le compte avec lequel la requête est lancée ne dispose pas des privilèges nécessaires pour la réalisation de cette opération.

Malgré tout, c’est bien un problème de sécurité qui est exposé par ce message d’erreur, en effet et vu que nous somme dans un contexte où la requête est lancée depuis un poste distant et qui procèdera à l'a lecture d’un fichier depuis un partage sur un autre serveur et qui fera appel à la procédure BULK INSERT sur le serveur de base de données, ce mécanisme et dans une infrastructure Windows implique le recourt à l’authentification Kerberos et bien sûr aux prérequis relatif à cette technologie.   

Résolution

Pour pouvoir exécuter la requête sans problème il existe deux méthodes:

Méthode 1

La première méthode est simple et elle consiste tout simplement à utiliser un compte SQL pour se connecter au serveur de base de données au lieu d’un compte Windows et bien sûre s’assurer que le compte de service du serveur de bases de données SQL Server accède au fichiers source, le login SQL devra bien sûr avoir le droit bulkadmin au niveau du serveur SQL.

Méthode 2

Configurer le serveur de base de données et le compte de service SQL pour permettre ce genre d’opération en :

Configurer le compte de service SQL

En ajoutant  le SPN MSSQLSvc au compte de service utilisé pour le démarrage du service SQL comme suit :

Si c’est une instance par défaut exécuter :

SETSPN –A MSSQLSvc/<fqdn du serveur SQL> <Nom du Compte de Service>

SETSPN –A MSSQLSvc/<fqdn du serveur SQL>:1433 <Nom du Compte de Service>

Si c’est une instance nommée:

SETSPN –A MSSQLSvc/<fqdn du serveur SQL>:<Nom de l’instance>

SETSPN –A MSSQLSvc/<fqdn du serveur SQL>:<Port d’écoute de l’instance>

Approuver le compte de service pour la délégation au niveau de l'AD.

image 

Configuration du compte machine du serveur de base de données

Approuver le compte machine du serveur de base de données pour la délégation au niveau de l’AD.

image

Sharepoint 2013 – Cannot connect to database master at SQL Server

Problème :

Lors du lancement de l'assistant de configuration de Sharepoint 2013, une erreur de connexion se produit sur la page de configuration des paramètres de la base de données de Sharepoint : “Cannot connect to database master at SQL Server…

image

clip_image001

Cause :

Les causes sont multiples. Il peut s’agir :

  1. D’un problème de pare-feu qui bloque le trafic entrant sur le serveur SQL sur le port 1433 ou tous les trafics entrants.
  2. De l’utilisateur spécifié pour la configuration n’a pas assez de permissions pour configurer notre ferme.
  3. D’un problème au niveau des paramètres de connexion de SQL Server avec le protocole TCP/IP qui est désactivé.
  4. Du service SQL Server Browser qui est désactivé.

    Résolution :
  • Dans le cas où il s’agit d’un problème de pare-feu

Nous devons ajouter une nouvelle règle aux pare-feu Windows autorisant le trafic entrant sur le serveur SQL.

Nous lançons le Windows Firewall with Advanced Security puis cliquez droit sur Inbound Rules pour créer une nouvelle règle :

image

Nous choisissons la règle qui concerne un port puis passez à la page suivante :

image

Cette règle s’applique sur le port 1433 en TCP :

image

Elle autorise les connexions entrantes vers le serveur SQL :

image

Et s’applique sur l’ensemble du domaine :

image

image

 

  • Dans le cas ou il s’agit d’un problème de droits insuffisants pour l’utilisateur
    Pour résoudre le problème lié à l’utilisateur, il faut lui attribuer les roles dbcreator et securityadmin sur le serveur SQL.

Nous vérifions que notre utilisateur a bien ces droits, si ce n’est pas le cas, nous les lui attribuions.

Lancez le SQL Server Management Studio, nous développons le dossier Security puis double-cliquons sur l’utilisateur en question pour accéder à ses propriétés. Nous naviguons jusqu’à l’onglet Server Roles et cochons dbcreator et securityadmin si ce n’est pas déjà fait puis validons l’opération en appuyant sur OK :

image

 

  • Dans le cas ou il s’agit d’un problème au niveau des paramètres de connexion de SQL Server

Nous lançons le SQL Server Configuration Manager puis nous naviguons dans le volet de droite et développons le menu SQL Native CLient 11.0 Configuration pour aller sur le Client Protocols.

Nous vérifions que notre protocole TCP/IP est bien activé. Si ce n’est pas le cas nous l’activons.

image

 

  • Dans le cas ou si s’agit d’un problème du service SQL Browser qui est désactivé
    Nous lançons le SQL Server Configuration Manager puis naviguons jusqu’aux services SQL “SQL Server Services. Nous vérifions l’état du service SQL Server Browser et voyons que le service est désactivé et arreté :

image

Nous commençons par changer le mode de démarrage du service en Manual afin de pouvoir activé le service :

image

Puis nous démarrons le service SQL Server Browser :

image

image