Archive

Author Archive

Office 2010 & co de sortie !

April 22nd, 2010 nb888 1 comment

Office 2010 et tous ce qui accompagne sa sortie (Sharepoint 2010, Office Web App…) sont disponibles en version final pour les abonnés MSDN !

https://msdn.microsoft.com/fr-fr/subscriptions/securedownloads/default.aspx?pv=1:383

Edit : Pendant le téléchargement, gagnez du temps en désinstallant la bêta, l’installeur ne supporte pas la mise à niveau.

  • LinkedIn
  • Twitter
  • Delicious
  • Facebook
  • Share/Bookmark

KBs Windows 7 du jour

April 21st, 2010 nb888 1 comment

Microsoft a publié plusieurs articles aujourd’hui sur windows 7 que j’ai trouvé intéressants:

- http://support.microsoft.com/default.aspx?scid=kb;fr;979240&sd=rss&spid=14482 : le fameux god mode qui a fait le tour du web il y a quelques mois officiellement expliqué.

- http://support.microsoft.com/default.aspx?scid=kb;fr;980456&sd=rss&spid=14482 : ou comment personnaliser l’écran de login de Win 7.

- http://support.microsoft.com/default.aspx?scid=kb;fr;979553&sd=rss&spid=14482 : assez surprenant, en fait windows n’utiliserait pas toutes les ressources à sa disposition au démarrage (proc et mémoire). Ce kb explique comment les utiliser au maximum.

  • LinkedIn
  • Twitter
  • Delicious
  • Facebook
  • Share/Bookmark
Categories: Uncategorized Tags: , ,

Jouer avec l’objectGUID

March 11th, 2010 nb888 No comments

Travaillant sur un annuaire Active Directory attaqué en php, j’ai eu besoin d’obtenir une référence unique sur certains objets de l’annuaire.

La doc Microsoft spécifie que cet attribut est défini à la création et qu’il n’est pas autorisé de le modifier, ce qui est bien la garantie que je souhaite. http://msdn.microsoft.com/en-us/library/ms679021%28VS.85%29.aspx

J’ai donc fait mon petit script pour interroger l’AD et récupérer l’objectGUID, pas de soucis jusque là. Là où ça s’est corsé, c’est tout simplement lorsque que j’ai voulu m’en servir dans une requête LDAP. En général ça marchait bien, sauf dans quelques cas… embêtant.

Tout d’abord, pour passer le paramètre en post ou en get, il est plus simple si il est sous forme de chaine de caractère, vous pouvez faire cette opération de la façon suivante :

bin2hex($ldapRes["objectguid"][0])

Pour se servir de cette objet dans une requête LDAP, on a ensuite naturellement tendance à faire l’opération inverse de bin2hex à savoir :

pack(‘H*’,$objectguidHex).

Cette méthode marchait pas trop mal sauf dans quelques cas. Là on pense qu’il faut éventuellement échapper quelques caractères, comme indiqué à la fin de cette page : http://msdn.microsoft.com/en-us/library/aa746475%28VS.85%29.aspx . J’ai donc écris ma petite fonction pour échapper  les caractères *,(,),\,NUL,/. Cette ajout a résolu un certain nombre de problèmes mais certains persistaient..

J’ai relu la doc et cette ligne a attiré mon attention :

In addition, arbitrary binary data may be represented using the escape sequence syntax by encoding each byte of binary data with the backslash (\) followed by two hexadecimal digits. For example, the four-byte value 0×00000004 is encoded as \00\00\00\04 in a filter string.

On peut donc échapper toutes les deux valeurs hexadécimales. Ce qui me donne la fonction suivante :

function ldap_escape($str, $for_dn = false)
{
$out = ”;
$hexStr=$str;
for($i = 0;$i<strlen($hexStr);$i=$i+2){
$out .= ‘\\’.$hexStr[$i].$hexStr[$i+1];
}

return $out;
}

Après plusieurs tests, j’ai aussi remarqué qu’il n’y avait pas besoin de repasser de hexadécimale au binaire pour faire une requête paramétrée par l’objectGUID. Ce qui me donne comme filtre :

$filter=’(&(objectCategory=person)(objectGUID=’.ldap_escape($upn).’))’

  • LinkedIn
  • Twitter
  • Delicious
  • Facebook
  • Share/Bookmark

Windows 2008 R2… l’os !

January 12th, 2010 nb888 No comments

(L’os pas l’o.s.)

Je vais ici vous faire partager la solution de l’os que j’ai rongé pendant de longs jours…

Je travaille actuellement sur la maquette finale d’une architecture pour authentifier des accès réseaux filaires ou non via PEAP et donc les crédentials windows. Je suis parti sur la dernière mouture du radius de Microsoft à savoir NPS qui est un role de Windows Server 2008.

J’ai installé la dernière version à savoir R2… l’erreur. Tout d’abord, j’ai eu longtemps l’impression qu’il y avait des problèmes de communication avec le domaine et sur tous mes serveurs fraichement installés !

Quelques symptômes :

- Dans la console d’administration des groupes d’utilisateurs locaux, les nom des comptes du domaines n’apparaissaient pas et étaient remplacés par leur SID.

- Lors de l’installation de Active Directory Certificate Services, l’installation échouait et on pouvait trouver dans les logs d’installation un “echec de la relation d’approbation”.

- Le must, dans mon serveur NPS, j’ajoutais des groupes AD à mes stratégies, et une fois le serveur redémarré les groupes avaient disparus !..

Après avoir sortit les rames et longtemps ramé, ramé, je suis tombé sur le KB976494. Au final quand on réfléchi, ça empêche tellement tout ce qui interagi avec un AD de fonctionner, que je ne comprend pas que Microsoft ne l’ai pas publié via Windows Update.

Le KB corrige un bug dans la fonction qui permet de traduire un nom de compte en sid. Indispensable à mon avis..

http://support.microsoft.com/kb/976494

  • LinkedIn
  • Twitter
  • Delicious
  • Facebook
  • Share/Bookmark
Categories: Windows Server Tags: , , , , , ,

Sharepoint 2010 [Prérequis logiciels]

November 21st, 2009 nb888 2 comments

Comme pas mal de monde, j’ai voulu installer la beta 2010 pour essayer.

J’ai d’abord pas mal galéré avec les prérequis.

J’étais parti sur l’OS stable le plus récent de Microsoft à savoir Windows 2008 R2. Il me fallait ensuite une base de donnée, là j’avais le choix d’installer SQL 2008 sur ma machine Sharepoint 2010 ou d’utiliser un SQL 2005 mutualisé.
J’ai donc voulu utilisé en 1er le SQL 2005 mutualisé. Un premier message lors de la création de la batterie vous demande de mettre à jour SQL 2005 en SP3 CU1. Tout cela prend un certain temps à télécharger et installer surtout que le site de microsoft est assez lent je trouve ; on tente à nouveau la création de la batterie et là surprise, l’assistant vous dit qu’il faut une base de données 64bits..
Bon je vais donc installer SQL 2008. Je lance l’install, un message m’informe qu’il y a un problème de compatibilité avec 2008 R2 et que sans le SP1 SQL 2008, ça ne marchera pas. Soit, je continue, quelques erreurs pendants l’installation mais je mets ça sur le compte de l’incompatibilité. Je continue ensuite avec l’installeur du SP1 et là horreur, il me dit que l’install de SQL 2008 ne se pas passée correctement et qu’il ne peut pas continuer !!!!

Après de longues heures de recherches d’une solution, j’ai trouvé l’astuce : il faut désinstaller tous les composants SQL 2008, supprimer les répertoires qui restent, redémarrer. Ensuite lancer l’install du SP1 (logique non ?) qui install alors une partie des composants puis lancer l’install de SQL 2008 puis relancer le SP1.

Bon bien sur, ce n’était toujours pas suffisant, il faut aussi installer un CU..

J’ai fini par arriver à créer ma batterie mais ce n’est pas pour autant que tout est rose. La plupart des fonctions (dont le profiling..) ne marchaient pas avant la sortie d’un fix qui s’est fait désiré. Même après passage du fix, ça ne marche pas, une autre erreur est apparue.

Une chose est sure, c’est une bêta…

  • LinkedIn
  • Twitter
  • Delicious
  • Facebook
  • Share/Bookmark
Categories: moss Tags: ,

Sauvegarder un ensemble de site collection WSS

November 11th, 2009 nb888 No comments

J’ai développé un petit script PowerShell qui permet de sauvegarder toutes les sites collections WSS d’une ferme hors site collection d’administration.

Il ne prend pas de paramètre car il sauvegarde la ferme local.

[system.reflection.assembly]::LoadWithPartialName(“Microsoft.Sharepoint”)

#Pour resoudre Prb output
$bindingFlags = [Reflection.BindingFlags] “Instance,NonPublic,GetField”
$objectRef = $host.GetType().GetField(“externalHostRef”, $bindingFlags).GetValue($host)

$bindingFlags = [Reflection.BindingFlags] “Instance,NonPublic,GetProperty”
$consoleHost = $objectRef.GetType().GetProperty(“Value”, $bindingFlags).GetValue($objectRef, @())

[void] $consoleHost.GetType().GetProperty(“IsStandardOutputRedirected”, $bindingFlags).GetValue($consoleHost, @())
$bindingFlags = [Reflection.BindingFlags] “Instance,NonPublic,GetField”
$field = $consoleHost.GetType().GetField(“standardOutputWriter”, $bindingFlags)
$field.SetValue($consoleHost, [Console]::Out)
$field2 = $consoleHost.GetType().GetField(“standardErrorWriter”, $bindingFlags)
$field2.SetValue($consoleHost, [Console]::Out)

$backupDir = ‘E:\backup\’;
$webServices = new-object Microsoft.SharePoint.Administration.SPWebServiceCollection([microsoft.sharepoint.administration.spfarm]::local)
ForEach ($webService in $webServices)
{
#Write-Output $webService;
ForEach($webApp in $webService.WebApplications)
{
Write-Output ‘——————————-’;
Write-Output $webApp.Name $webApp.DefaultServerComment ;
If(!$webApp.IsAdministrationWebApplication)
{
ForEach($site in $webApp.Sites)
{
Write-Output ‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~’;
$msg = ([DateTime]::Now).toString() + ‘- Sauvegarde de ‘ + $site.url;
Write-Output $msg ;

$msg = ([DateTime]::Now).toString()+ ‘ – Lock de la collection’;
Write-Output $msg ;
stsadm -o setsitelock -url $site.url -lock readonly;

$backupFile = $backupDir + $site.hostname + ‘-’ + $site.ID +’.bak’;
$msg = ([DateTime]::Now).toString() + ‘ – Sauvegarde de la collection sous ‘+ $backupFile;
Write-Output $msg ;
stsadm -o backup -url $site.url -overwrite -filename $backupFile;

$msg = ([DateTime]::Now).toString() + ‘ – UnLock de la collection’;
Write-Output $msg ;
stsadm -o setsitelock -url $site.url -lock none;

$msg= ([DateTime]::Now).toString() + ‘ – Fin Sauvegarde de ‘ + $site.url;
Write-Output $msg ;
}
}
else
{
Write-Output ‘Administration WebApp – Skipping’;
}
}
}

  • LinkedIn
  • Twitter
  • Delicious
  • Facebook
  • Share/Bookmark
Categories: moss Tags: , , , ,

Envoyer automatiquement par mail un tableau de bord Excel depuis MOSS

November 7th, 2009 nb888 No comments

Récemment on m’a demandé d’envoyer toutes les semaines par mail un rapport qui existait déjà dans notre report center MOSS.

Afin de ne pas avoir à tout refaire et d’utiliser le rapport existant, j’ai développé un petit programme bash qui effectue l’extraction d’un snapshost du rapport, cache les feuilles excel qui ne doivent pas figurer, effectue un export en PDF et l’envoie par mail. Il n’y plus qu’ensuite à programmer l’exe via le gestionnaire de taches windows.

Prérequis pour faire fonctionner le programme : avoir Excel 2007 installé et sans le SP2, il faut aussi le complément pour exporter en PDF installé.

La conversion d’un fichier Excel en PDF est bien documenté sur msdn, la récupération du fichier excel utilise un des nombreux webservices présents dans MOSS (http://serveur-moss07/_vti_bin/excelservice.asmx) que j’ai ajouté comme référence web à mon projet.

Ci dessous le code C# :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Services.Protocols;
using sendMossExcel.ExcelWebService;
using System.IO;
using System.Net.Mail;
using Microsoft.Office.Interop.Excel;

namespace sendMossExcel
{
class Program
{
static void Main(string[] args)
{
try
{
if (args.Length < 1)
{
Console.Error.WriteLine("Command line arguments should be: [workbook_path]");
return;
}

String tempXlsxName = System.IO.Path.GetTempFileName();
String tempPdfName = System.IO.Path.GetTempFileName();

//recuperation via webservice
byte [] workbook = retrieveWorkBook(args[0]);

//enregistrement
writeTempory(workbook, tempXlsxName);

customAndExport(tempXlsxName, tempPdfName);
MailMessage mail = new MailMessage(sendMossExcel.Properties.Settings.Default.mailFrom, sendMossExcel.Properties.Settings.Default.mailTo);
mail.Subject = sendMossExcel.Properties.Settings.Default.mailSubject;
mail.IsBodyHtml = true;
mail.Body = sendMossExcel.Properties.Settings.Default.mailBody;

mail.Attachments.Add(new Attachment(File.Open(tempXlsxName,FileMode.Open), "report.xlsx","Microsoft/Excel"));
mail.Attachments.Add(new Attachment(File.Open(tempPdfName+".pdf", FileMode.Open), "report.pdf", "Adobe/PDF"));

SmtpClient smtpClient = new SmtpClient();
smtpClient.Host = sendMossExcel.Properties.Settings.Default.mailSmtpServer;
smtpClient.Send(mail);

mail.Dispose();

File.Delete(tempPdfName + ".pdf");
File.Delete(tempPdfName);
File.Delete(tempXlsxName);

Console.WriteLine("Traitement Termine Correctement");
}

catch (SoapException e)
{
Console.WriteLine("SOAP Exception Message: {0}", e.Message);
}

catch (Exception e)
{
Console.WriteLine("Exception Message: {0}", e.Message);
Console.WriteLine(e.Data);
Console.WriteLine(e.StackTrace);
}

}

static byte[] retrieveWorkBook(string Uri)
{
// Instantiate the Web service and
// create a status array object.
ExcelServiceSoapClient xlService = new ExcelServiceSoapClient();
Status[] status;

xlService.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

// Open the workbook, then call GetWorkbook
// and close the session.
string sessionId = xlService.OpenWorkbook(Uri, "en-US", "en-US", out status);
xlService.Refresh(sessionId, "");
byte[] workbook = xlService.GetWorkbook(sessionId, WorkbookType.PublishedItemsSnapshot, out status);
// byte[] workbook = xlService.GetWorkbook(sessionId, WorkbookType.FullWorkbook, out status);
// byte[] workbook = xlService.GetWorkbook(sessionId, WorkbookType.FullSnapshot, out status);

// Close the workbook. This also closes the session.
status = xlService.CloseWorkbook(sessionId);
return workbook;
}

static void writeTempory(byte[] fileBytes, string fileName)
{
BinaryWriter binaryWriter = new BinaryWriter(File.Open(fileName, FileMode.OpenOrCreate));
binaryWriter.Write(fileBytes);
binaryWriter.Close();
}

static void customAndExport(string xlsxFileName, string pdfFileName)
{
object paramMissing = System.Type.Missing;

//ouverture excel et fichier
ApplicationClass excelApplication = new Microsoft.Office.Interop.Excel.ApplicationClass();
Workbook excelWorkBook = excelApplication.Workbooks.Open(xlsxFileName, paramMissing, paramMissing, paramMissing, paramMissing, paramMissing, paramMissing, paramMissing, paramMissing, paramMissing, paramMissing, paramMissing, paramMissing, paramMissing, paramMissing);

//custo
for (int i = 2; i < 5; i++)
{
((Worksheet)excelWorkBook.Worksheets.get_Item(i)).Visible = XlSheetVisibility.xlSheetVeryHidden;
}
for (int i = 6; i < 10; i++)
{
((Worksheet)excelWorkBook.Worksheets.get_Item(i)).Visible = XlSheetVisibility.xlSheetVeryHidden;
}
((Worksheet)excelWorkBook.Worksheets.get_Item(1)).PageSetup.Orientation = XlPageOrientation.xlLandscape;
((Worksheet)excelWorkBook.Worksheets.get_Item(5)).PageSetup.Orientation = XlPageOrientation.xlLandscape;

//export
excelWorkBook.ExportAsFixedFormat(Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF, pdfFileName, XlFixedFormatQuality.xlQualityStandard, true, false, paramMissing, paramMissing, false, paramMissing);

//fermeture
excelWorkBook.Save();
excelWorkBook.Close(false, paramMissing, paramMissing);
excelApplication.Quit();
}
}
}

  • LinkedIn
  • Twitter
  • Delicious
  • Facebook
  • Share/Bookmark
Categories: moss Tags: , , , , , , ,