Azure : Faire cohabiter du PHP et du .NET sur un même site, c’est possible !

azure_logo Dans Azure, le cloud de Microsoft, il est possible de faire héberger un site web qui contient des pages .NET et PHP.
Avec le recul, ça peut paraître évident. Mais j’ai été surpris au premier abord.

Dans l’onglet « Configuration » du site, il suffit de vérifier si les 2 frameworks sont activés :

azure_1

(Désolé, c’est une capture de l’ancien portail Azure, mais je ne peux pas encadrer le nouveau portail avec son UX horrible)

Du côté de Visual Studio, ça se présente ainsi, pas besoin d’installer une extension du genre PHP Tools, il suffit d’ajouter ses fichiers PHP à la solution :

azure_2

Je me suis aperçu de tout cela en implémentant un back-end web-services en C# sur ma vieille appli PHP des années 90. Et ça marche nickel !

NB : Je ne serai pas étonné qu’on puisse également ajouter du JAVA et du Python, afin d’obtenir une application web œcuménique où les langages cohabiteraient en paix.

SharePoint 2013 : Email notifications are not sent (from My Site’s newsfeed)

sharepoint2013 Context : Users of your SharePoint web applications can receive email alerts, but they are never notified by all the « My Site » activities, such as « Someone has started following you » or « Someone has mentioned you ».

In the SharePoint logs (ULS), you can see errors like:

Failed attempt x sending mail to recipients: surname.name@mycompany.com. Mail Subject: NAME Surname mentioned you in a conversation. Error: SmtpException while sending email: System.Net.Mail.SmtpException: Mailbox unavailable. The server response was: 5.7.1 Client does not have permissions to send as this sender

Solution : These notifications seem to be sent in an authenticated way, by the app pool service account (unlike the standard emails (alerts) that use the address defined in the « outcoming email » in central administration, in an anonymous way). So you have to add the right « Send-As » to this account in Exchange.

NB : If it doesn’t work, grant this right to the SharePoint Timer service account as well. I still have a doubt on this one :/

Source : Technet forum

IIS : Erreur lors de la déclaration de l’identité d’un pool d’application

iisSur un serveur qui fonctionnait parfaitement (c’est à dire que IIS tourne et les sites répondent), je crée un nouveau pool d’application avec un compte d’annuaire comme identité. Et là boom, erreur de type « Données incorrectes » (HRESULT : 0x80090005) :

iis_bad_data

Ou plus sexy en Powershell :

iis_bad_data_ps

Dans un premier temps, on pourrait croire que le mot de passe du compte est erroné. Mais ce n’est pas le cas. Quand cette erreur survient, le serveur a déjà vérifié la validité du compte.

Comment IIS encrypte les mots de passe ?
IIS encrypte les mots de passe en utilisant différents providers qui sont stockées dans le fichier applicationHost.config (%SystemRoot%System32inetsrvconfig), dans la section <configProtectedData>, par exemple :


<add name="IISWASOnlyAesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="*****" />

Le provider « AesProvider » est utilisé pour crypter et décrypter les sections system.webServer.
Le provider « IISWASOnlyRsaProvider » est utilisé pour crypter et décrypter les sections dans le applicationHost.config.

Quant aux clés d’encryption, elles sont dans C:ProgramDataMicrosoftCryptoRSAMachineKeys, et elles sont uniques à chaque serveur !

Conclusion : Cette erreur viendrait du fait que les providers décrits dans applicationHost.config ne correspondent plus aux clés du serveur.

Que s’est-il passé ?
Il y a évidemment plusieurs scénarii qui aboutissent à ce problème, mais le plus simple est le suivant : le fichier applicationHost.config a été écrasé à partir d’une copie d’un autre serveur.

Comment résoudre ?
Il y a plusieurs solutions aussi, plus ou moins douloureuses :
Restaurer le fichier applicationHost.config s’il a été sauvegardé,
Réinstaller le rôle « Serveur web »,
Importer également les clés du serveur d’origine. Cet article explique bien le problème et la manipulation à faire.

Un autre article intéressant explique tout cela en détail : MachineKeys on IIS 7.x : Inside Out.

SharePoint 2013 : How I fixed my corrupted AppFabric Cache Service

sharepoint2013 I have faced some troubles with Ditributed Cache… (again ?)
Especially when I tried to change the service account of the AppFabric Caching service, as explained here.
Then, my services seemed corrupted, it was impossible to restart them properly (Restart-CacheCluster command).

Their status was stuck on STARTING for a few minutes, and then went DOWN :


PS C:Userssp_admin> Use-CacheCluster
PS C:Userssp_admin> Get-CacheHost

HostName : CachePort Service Name Service Status
-------------------- ------------ --------------
Server1:22233 AppFabricCachingService DOWN
Server2:22233 AppFabricCachingService STARTING

And I had this error in the Windows Event logs (Event ID 1000 and 1001) – Seeing a failing KERNELBASE.dll module is not very reassuring !

cache_21

This is what I have done to fix it. BEWARE that a corrupted distributed cache can result in resinstalling SharePoint from scratch ! So please be careful.

1- Stop all the SharePoint Distributed Cache service instances (on each WFE) :

Use-CacheCluster
Stop-SPDistributedCacheServiceInstance -Graceful
Remove-SPDistributedCacheServiceInstance

Use this code to force the uninstall :

Get-SPServiceInstance | ? {($_.service.tostring()) -eq "SPDistributedCacheService Name=AppFabricCachingService"} | % { $_.Server; $_.Status; $_.Id }

$s = Get-SPServiceInstance <GUID>

$s.Delete()

2- Unregister all hosts (on each WFE) :

Unregister-CacheHost

3- Register all hosts :

Register-CacheHost -Provider "SPDistributedCacheClusterProvider" -ConnectionString "Data Source=DBAlias;Initial Catalog=SPServer2013_Config;Integrated Security=True;Enlist=False" -Account "DOMAINSP_DistributedCache" -CachePort 22233 -ClusterPort 22234 -ArbitrationPort 22235 -ReplicationPort 22236 -HostName Server1

  • The parameter « Account » must be the managed account that run the service (as displayed in the central administration).
  • The parameters « Provider » and « ConnectionString » must be copied from the following file « C:Program FilesAppFabric 1.1 for Windows ServerDistributedCacheService.exe.config »
  • The parameter « HostName » must be changed as well.

4- Start each cache host (on each WFE) :

Start-CacheHost -ComputerName Server1 -CachePort 22233

5- Restart all the servers

6- Create the SharePoint Service Instances (on each WFE) :

Add-SPDistributedCacheServiceInstance

Everything went well then. These 2 commands showed me that the services were Online, and the AppFabric Services were marked as UP :

Get-SPServiceInstance | ? {($_.service.tostring()) -eq "SPDistributedCacheService Name=AppFabricCachingService"} | % { $_.Server; $_.Status; $_.Id }

Use-CacheCluster
Get-CacheHost