Je me suis laissé entendre dire que la migration des données SharePoint n’était pas ce qu’il y a de plus facile. Ah bon ?
Petite mise en situation : Prenez un expert SharePoint (un vrai hein, comme Yoann par exemple !), une base de données qui contient des informations codées dans un champ binaire, un fichier XML qui contient d’autres données (codées en… vous verrez plus loin) et vos identifiants Windows (les fameux SID qui ressemblent à ça : S-1-5-21-xxx). Vous mélangez bien, et vous obtenez ça :
- 01050000000000051500000038EDA9CF33F7AFDD94FC17C4F4010000
- S-1-5-21-3484020024-3719296819-3289906324-500
- AQUAAAAAAAUVAAAAOO2pzzP3r92U/BfE9AEAAA==
Vous l’aurez deviné le premier est le champ binaire stocké dans SQL Server. Le second, notre fameux SID. Et le troisième : le même codé en Base64 ! (Et là on applaudit Arnaud, parce que c’est lui qui a trouvé !)
Yoann a beau être un expert en SharePoint (et je vous jure que c’est vrai), les méthodes de conversion d’une forme vers une autre ne sont pas si évidentes que ça à trouver. D’ailleurs, en fouillant bien, on n’en a pas trouvé beaucoup.
Alors sous vos yeux ébahis, voici une petite classe utilitaire avec les méthodes qui vont bien pour convertir les données d’une forme vers une autre. Si un jour vous avez une migration de données SharePoint, ça pourra toujours être utile.
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Principal;
public class SharePointUtils {
private static byte[] BinaryStringToByteArray(string binaryString) {
return Enumerable.Range(0, binaryString.Length).Where(x => x % 2 == 0).
Select(x => Convert.ToByte(binaryString.Substring(x, 2), 16)).ToArray();
}
public static string BinaryStringToSidString(string binaryString) {
return new SecurityIdentifier(BinaryStringToByteArray(binaryString), 0).ToString();
}
public static string SidStringToBinaryString(string sId) {
StringBuilder sb = new StringBuilder();
SecurityIdentifier si = new SecurityIdentifier(sId);
byte[] array = new byte[si.BinaryLength];
si.GetBinaryForm(array, 0);
array.ToList<byte>().ForEach(x => sb.AppendFormat("{0:X2}", x));
return sb.ToString();
}
public static string BinaryStringToBase64String(string binaryString) {
byte[] array = BinaryStringToByteArray(binaryString);
return Convert.ToBase64String(array);
}
public static string Base64StringToBinaryString(string base64String) {
byte[] array = Convert.FromBase64String(base64String);
return SidStringToBinaryString(new SecurityIdentifier(array, 0).ToString());
}
}
Et un exemple d’utilisation :
string mySid =
"S-1-5-21-3484020024-3719296819-3289906324-500";
string myBinaryString =
"01050000000000051500000038EDA9CF33F7AFDD94FC17C4F4010000";
string myBase64String =
"AQUAAAAAAAUVAAAAOO2pzzP3r92U/BfE9AEAAA==";
string binaryString = SharePointUtils.SidStringToBinaryString(mySid);
string sidString = SharePointUtils.BinaryStringToSidString(myBinaryString);
string b64 = SharePointUtils.BinaryStringToBase64String(myBinaryString);
binaryString = SharePointUtils.Base64StringToBinaryString(myBase64String);
}
Le coup du Linq dans les méthodes, c’est sur une idée d’Arnaud (perso, je l’avais joué à la McGyver, avec une boucle et un compteur…).
En espérant que ça puisse servir à quelqu’un d’autre.
Dom, bien aidé sur le coup d’Arnaud et Yo.