Le blog technique

Toutes les astuces #tech des collaborateurs de PI Services.

#openblogPI

Retrouvez les articles à la une

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

SCOM–Impossible d’accéder aux sites de l’APM

Quelques temps après le déploiement d’une infrastructure SCOM 2012, un client a souhaité mettre en place une de ses nouvelles fonctionnalités, à savoir le monitoring applicatif (APM).

Après avoir mis en supervision quelques applications Web, nous nous sommes rendus compte que les sites permettant l’analyse de cette supervision (nommés respectivement Application Diganostics et Application Advisor) ne fonctionnaient pas : lors d’une tentative d’accès, ils renvoyaient tous deux une erreur « An error has occured : The additional error information can be found in the Windows Application Log. We apologize for any inconvenience caused by this temporary service outage. »

clip_image002

Un tour dans l’event viewer nous en apprend effectivement un peu plus :

clip_image004

Le message complet indique :

Event code: 3005
Event message: An unhandled exception has occurred.
Event time: 01/03/2013 16:52:22
Event time (UTC): 01/03/2013 15:52:22
Event ID: b5c9f03cbae94f40b2e35d1a28651518
Event sequence: 8
Event occurrence: 1
Event detail code: 0

Application information:
Application domain: /LM/W3SVC/1/ROOT/AppAdvisor-2-130066267234915799
Trust level: Full
Application Virtual Path: /AppAdvisor
Application Path: D:\OpsMgr\WebConsole\AppDiagnostics\AppAdvisor\Web\
Machine name: BT1SVX2K

Process information:
Process ID: 2868
Process name: w3wp.exe
Account name: IIS APPPOOL\OperationsManagerAppMonitoring

Exception information:
Exception type: OleDbCommandException
Exception message: Exception has been thrown by the target of an invocation.
Command text: SELECT apm.IsInstallCompleted ()
Connection: Provider=SQLOLEDB;Server=BTCISQL03\OPSVMM;database=OperationsManagerDW;Integrated Security=SSPI;

at Avicode.AX5.Data.OleDb.OleDb.ExecuteScalar(OleDbCommand oleDbCommand)
at Avicode.Intercept.SEManager.Core.DBAccess.DB.ExecuteScalar(String query)
at Avicode.Intercept.SEManager.WebViewer.Pages.Authenticate.Page_Load(Object sender, EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Exception has been thrown by the target of an invocation.
at Avicode.AX5Base.IdentityThread.Execute(Action action)
at Avicode.AX5.Data.OleDb.OleDb.ExecuteScalar(OleDbCommand oleDbCommand)

Login failed for user ‘NT AUTHORITY\ANONYMOUS LOGON’.
at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.OleDb.OleDbConnection.Open()
at Avicode.AX5Base.IdentityThread.ActionItem.ExecutionBody(Object actionItem)

Request information:
Request URL: http://localhost/AppAdvisor/Pages/Authenticate.aspx?ReturnUrl=/AppAdvisor
Request path: /AppAdvisor/Pages/Authenticate.aspx
User host address: ::1
User:
Is authenticated: False
Authentication Type:
Thread account name: IIS APPPOOL\OperationsManagerAppMonitoring

Thread information:
Thread ID: 15
Thread account name: IIS APPPOOL\OperationsManagerAppMonitoring
Is impersonating: False
Stack trace: at Avicode.AX5.Data.OleDb.OleDb.ExecuteScalar(OleDbCommand oleDbCommand)
at Avicode.Intercept.SEManager.Core.DBAccess.DB.ExecuteScalar(String query)
at Avicode.Intercept.SEManager.WebViewer.Pages.Authenticate.Page_Load(Object sender, EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

La partie intéressante étant Login failed for user ‘NT AUTHORITY\ANONYMOUS LOGON’, puisqu’elle indique qu’ASP a refusé une connexion anonyme.

Il est donc temps d’aller faire un tour du coté de la MMC IIS, plus précisément dans les Applications Pool. Voici ce qu’on y trouve :

clip_image006

Configuré de la sorte, cela ne permet pas d’accéder à la base de données, d’où notre erreur. Il faut donc les modifier et mettre un compte qui a les droits sur la base via les Advanced Settings :

clip_image008

clip_image010

Répéter l’opération pour le second Application Pool, puis recycler les deux.

Voilà, désormais l’accès est possible !