SharePoint 2013 : Load balancer could not find the endpoint for… (SPEndpointAddressNotFoundException)

Stupeur et tremblement dans les ULS…
sharepoint2013
This kind of warning can occur with any service application. It means that the application (under IIS) is not running or does not exist !
How can I check ?
When you create a new service application, you should always check that it is actually running under IIS :

  • Get the Service Application ID (SharePoint 2013 Management Shell) :
  • (Get-SPServiceApplication -name "WorkManagementServiceApp").Id
    SPEndpointAddressNotFoundException_Capture_1

  • Launch IIS Manager (inetmgr.exe) , and check if the web application exists under « SharePoint Web Services » :
  • SPEndpointAddressNotFoundException_Capture_2

  • Also check if the associated application pool is running

What Happened ?
If you created your service application with Powershell, there is a chance that it has not been provisioned.
The command « Get-SPServiceApplication » might return something, but there’s no app in IIS ! This article explains it with more details.
See that example that creates a Work Management Service :

# Get the App Pool Account :
$appPoolAccount = Get-SPManagedAccount "DOMAINSPServices"
New-SPServiceApplicationPool -Name "WorkManagementProxyApplicationPool" -Account $appPoolAccount
$appPool = Get-SPServiceApplicationPool "WorkManagementProxyApplicationPool"
# Create the Service Application :
New-SPWorkManagementServiceApplication -Name "WorkManagementService" -ApplicationPool $appPool
$serviceApp = Get-SPServiceApplication -name "WorkManagementService"
# Create Proxy
New-SPWorkManagementServiceApplicationProxy -name "WorkManagementServiceProxy" -ServiceApplication $serviceApp -DefaultProxyGroup

Solution
Is that enough ? No, it isn’t. You should provision it :

$serviceApp.Provision()

A few minutes later, you should see the web application and the application pool runnning in IIS.

Which DLL are used by a process ?

MS-DOS_iconSometimes, you need to move or update a DLL file, but you receive an error message saying : « Access denied ».
It’s not always a file access right problem.
Mayby this library is currently used by a process. To found out which one, just type use the tasklist command in a DOS / Powershell prompt :

tasklist /m your_dll_file.dll

Simple !
Furthermore, if you want to know which regular file (not DLL) is being used by a program, you can download and run process explorer from Windows Sysinternals website. Then « Find > Find Handle or DLL ».

Log4Net / Powershell : Modifier à la volée la configuration d'un appender

Pour les besoins d’un projet, je devais modifier dynamiquement le nom du fichier de traces généré par la bibliothèque Log4Net. La majorité de la configuration est située dans un fichier .config, tandis que le nom du fichier de sortie est géré à l’exécution du script.
Voici l’adaptation de mon script Powershell que j’ai dû effectuer :

# Chargement de la bibliothèque et de sa configuration.
 [void][Reflection.Assembly]::LoadFrom( "log4net.dll")
 $FileInfo=new-object System.IO.FileInfo "log4net.Config"
 [log4net.Config.XmlConfigurator]::Configure($FileInfo)
# Configuration du nom du fichier de trace
 # - Récupération de l'appendre défini dans le fichier .config
 $hierarchy = [log4net.LogManager]::GetRepository()
 $appender = $hierarchy.GetAppenders() | Where-Object { $_.Name -eq "MonAppender" }
# - Modification du nom du fichier log
 $appender.File = "E:	racesout.log"
 $appender.ActivateOptions()
# Récupération de l'objet pour gérer les traces dans le script
 $LogFile = [log4net.LogManager]::GetLogger($logger)
$LogFile.Error("bla bla bla")

Pour info, voici à quoi ressemble le fichier de configuration :

<?xml version="1.0" encoding="utf-8" ?>
 <log4net>
 <appender name="MonAppender" type="log4net.Appender.RollingFileAppender">
 <file value="E:	races" />
 <appendToFile value="true" />
 <staticLogFileName value="false" />
 <rollingStyle value="Date" />
 <layout type="log4net.Layout.PatternLayout">
 <param name="ConversionPattern" value="%d{yyyy-MM-dd hh:mm:ss} %-5p - %m%n" />
 </layout>
 <filter type="log4net.Filter.LevelRangeFilter">
 <levelMin value="DEBUG" />
 <levelMax value="FATAL" />
 </filter>
 </appender>
<root>
 <level value="DEBUG" />
 <appender-ref ref="MonAppender" />
 </root>
 </log4net>

Batch DOS : Supprimer un ensemble de fichiers en conservant les plus récents

Pour supprimer tous les fichiers d’un répertoire, mais en conservant les plus récents, une seule ligne de commande suffit.
Pratique lorsque qu’on souhaite conserver les fichiers de traces *.log des 7 derniers jours par exemple :
forfiles /P "C:dossier races" /M "*.log" /C "cmd /c del @file" /d -7
Et oui, je découvre la commande « forfiles » à 33 ans, c’en est presque émouvant. Plus d’info ici : Technet.

PERL / Appcmd : Add a mapping element that contains spaces and quotes.

How to encode encoded characters without escaping them ? ^_^
When you try to add a module mapping for perl, it is supposed to be configured like this in IIS :
Request Path : *.pl
Executable : C:Perlinperl.exe « %s » %s
This declaration looks like this in IIS config files (web.config or machine.config) :
<handlers>
<add name="Perl" path="*.pl" verb="GET,HEAD,POST" modules="CgiModule" scriptProcessor="E:Perl64Perl64inperl.exe &quot;%s&quot; %s" />
</handlers>
The double-quotes that surrounds %s are encoded with XML encoding.
But when you use appcmd command to declare this module mapping, it is a bit more tricky, because you cannot use the special character &. Furthermore, the presence of spaces into the « scriptProcessor » attribute force you to surround the whole expression with double-quotes…
So, this is the appcmd command :
appcmd.exe set config /section:handlers /"+[name='Perl',paverb='GET,HEAD,POST',modules='CgiModule',scriptProcessor='E:Perl64Perl64inperl.exe %u0022%s%u0022 %s']"
 
 

Windows Server : Bien redémarrer le service WebClient.

Symptôme : Des commandes “net use” ne fonctionnent pas (Erreur 67, 53, ou “The workstation driver is not installed”, “Le pilote de station de travail n’est pas installé”)
Diagnostic : Le service “WebClient” n’est pas démarré OU des services dépendants ne sont pas lancés (webdav).
Solution: Valable pour tout type de symptômes, voici les commandes à passer dans cet ordre :
net stop webclient
net stop mrxdav
net start mrxdav
net start webclient

Connaitre les versions du Framework .NET installées

Toutes les versions sont stockées en base de registre. Exécuter la commande MSDOS suivante :
reg query « HKLMSOFTWAREMicrosoftNET Framework SetupNDP »
Pour connaître les service pack associés, lire la version du framework voulue :
reg query « HKLMSOFTWAREMicrosoftNET Framework SetupNDPv3.5 »
Attention, à partir du framework 4.5, c’est cette clé qu’il faut vérifier : HKEY_LOCAL_MACHINESOFTWAREMicrosoftNET Framework SetupNDPv4Full
Pour le niveau du service pack, il faut récupérer la valeur « Release ». Voir ce billet : How to: Determine Which .NET Framework Versions Are Installed.

Javascript : Fonction masquer / afficher un bloc

Lien qui masque ou affiche un élément dans une page web.
Voici comment faire pour créer un lien qui masque ou affiche un élément dans la page :
– Créer le lien : <a href="#" onclick="javascript:ShowOrHide('MonPanel')" >Masquer / Afficher</a>
– Donner le bon ID à l’élément à masquer / afficher : <div ID="MonPanel">Bla bla</div>
– Insérer cette fonction dans la page :
function ShowOrHide(CtrlID)
{
oCtrl = document.getElementById(CtrlID);
if (oCtrl)
{
if (oCtrl.style.display == "none" || oCtrl.style.display == "")
{
oCtrl.style.display = "block";
}
else
{
oCtrl.style.display = "none";
}
}
}

Expressions régulières : mot de passe complexe

3 heures d’enquête pour ça !
Voici l’expression régulière pour valider un mot de passe constitué ainsi :
– Doit avoir 6 caractères exactement
– Doit contenir 4 chiffres, 1 seule lettre (parmis A, B, C, D et E) et 1 seul caractère spécial (# ou @)
Tout ceci dans n’importe quel ordre.
L’espression régulière est donc la suivante :
^(?=(.*[0-9].*){4})(?=.*[A-E])(?=.*[@#]).{6}$
La difficulté provient de « 1 seule lettre » et « 1 seul spécial ». Ce qui revient à « 4 chiffres exactement ».
« 4 chiffres exactement » se traduit par la « look-back assertion » ou « traitement lookaround » suivant : (?=(.*[0-9].*){4})
 
Tests :

A#1234 : vrai

AB#123 : faux
1A#@12 : faux
1A#312 : vrai