Monday, October 10, 2016

Solving Sharepoint Configuration DB orphans

Hi, it took some efforts to get out of this one ;)

Symptoms : your sharepoint environment explodes when the wizard is launched, with an error message saying :

"The ALTER TABLE statement conflicted with the FOREIGN KEY SAME TABLE constraint "FK_Objects_Objects". The conflict occurred in database "SharePoint_Config", table "dbo.Objects", column 'Id'

No recovering from this is possible, as there data written but no rollback, you get various error messages like "Invalid object name 'SiteMapVisible'" , but you just lost your sharepoint platform.
Restoring the config DB is the only solution.

Solution :

 Locate any orphan using SQL :

use SharePoint_Config select distinct Id from dbo.Objects where ParentId not in (Select Id from dbo.Objects) 

 (find the IDs of object not having any parents objects == orphans)

Action :
Warning : this not supported by MS and can destroy your sharepoint, backup first! 

Copy and paste the IDs into a string array, then delete them :

 Add-PsSnapin Microsoft.SharePoint.PowerShell -EA 0

$array = @("71AF3D3B-63D5-4....", "....")   # our IDs from (1)

foreach ($element in $array) {
    stsadm.exe -o deleteconfigurationobject -id $element
}

A SQL delete is probably just as good, but i lose nothing using the deleconfig command, which perhaps does more.

Thursday, January 14, 2016

Internes en mobilité et SSO avec azure AD app proxy

Dans un contexte de mobilité et BYOD, on désire de plus en plus ouvrir l’accès aux ressources "on premise" en dehors de l’entreprise. Si ADFS reste la référence pour l’ouverture aux externes, l’équipe Azure de MS a développé récemment un proxy applicatif permettant de se connecter en SSO sans mise en place d’infrastructure ou reconfiguration de l’application "on premise". Votre application (ici un portail SharePoint) est tout simplement publiée comme une APP sur votre portail 365. L’authentification est transparente, en interne comme en mobilité. On peut, bien sur, panacher avec ADFS pour les "vrais" externes qui n'auraient pas de compte dans un AD approuvé.

Le Principe

Dans le cas d’un utilisateur externe, on ne peut pas recourir à l’authentification intégrée sans VPN, et on recourt généralement à ADFS : auth1 Si l’utilisateur externe (ou en mobilité) est référencé dans un annuaire AD, il existe une alternative à ADFS, présentée dans le cadre de ce post : auth2 On évite ainsi :
  • De déployer ADFS
  • De recourir à un formulaire d'authentification ou autre custom provider
Le pré-requis est d'avoir synchronisé les utilisateurs avec notre tenant 365. On centralise alors l'authentification sur le tenant, et cette identitée "online" pourra être convertie en SSO en une identité interne via ce proxy applicatif. Par exemple, dans le cas de l'authentification windows intégrée, "eissaly@mcnext.com" peut être utilisé comme "MCNEXT\Emmanuel.issaly"

Configuration 365

Si votre annuaire est déjà synchronisé avec azure AD (c’est un prérequis), Vous pouvez sauter ce chapitre. Sinon, créez un tenant Office 365 de test (un tenant de dev MSDN suffit) image007 Créez une adresse admin facile à mémoriser, ici j’ai pris admin@eissaly.onmicrosoft.com Sur ce tenant « eissaly », allez activer Azure AD par la tuile d’admin : image008 Vous devez synchroniser les utilisateurs de votre domaine local avec un domaine online. Dans mon cas, mcnext.com étant déjà pris, j’ai ajouté un suffixe UPN « @clouddetest.fr » à mon AD de tests sp2013.local. Emmanuel ISSALY est alors identifié par SP2013\eissaly *ou* eissaly@clouddetest.fr. Pour déclarer et vérifier le domaine clouddetest.fr dans azure, allez dans « Domains » du tenant 365 : image009 Une fois le domaine vérifié, on peut lancer la synchronisation d’un serveur quelconque de notre lab avec ADCONNECT. C’est en fait un FIM customisé (au sens qu’il fonctionne correctement). Il vous faudra le compte admin 365 et le compte admin du domaine local.

Licences

Pour que l’application proxy fonctionne, il faut une licence Basic ou Premium AAD pour chaque utilisateur. Activez le premium trial, ce qui vous donnera 100 licences. image012

Publication de l’application SharePoint

Publication azure

Nous allons publier notre SharePoint on prem comme une APP dans 365 : Allons dans « Applications » de notre Azure AD, et faisons « ADD » image013 image014 Puis s’offre à nous l’option de télécharger ce nouveau connecteur : image015 Déployez-le sur un serveur 2012 R2 qui a accès à internet. Le serveur de synchro qui fait déjà AD connect est une bonne destination pour lui ! Suite à l'activation de ce connecteur, on a d'autres options dans la configuration de notre application : 1.- Une URL publique générique, ou l’adresse publique de votre domaine : image017 image018 2. et la patte interne, en windows intégré : image019 à noter que l'équipe azure AD travaille sans cesse à proposer de nouveau mappings, et l'on peut même maintenant convertir l'identité online à une identité non windows (via la délégation Kerberos)

Configuration HTTPS / Kerberos

Pour que cela marche, il faut quand même quelques contraintes, en l’occurrence une délégation contrainte Kerberos (KCD)
  1. Créer le SPN du portail (nom court nom long et compte de pool d’appli)
setspn –S http/portal sp_app setspn –S http/portal.clouddetest.fr sp_app 2. Autoriser la délégation KCD sur le serveur qui héberge le connecteur : Sur un contrôleur de domaine, Propriétés sur l’ordinateur, onglet délégation, autoriser la délégation : image020image021 Puis ajoutez le SPN (on le trouve par le compte de pool) image022 Vous devriez à présent obtenir un ticket kerberos en appelant votre site SharePoint. Attention, il faut que le DNS appellé soit une IP (A record), pas un alias !

Synthèse

Le site SharePoint étant déclaré sur le tenant, on peut y accèder par un clic de tout périphérique connecté à Internet : image023 De ce fait, que l'on soit à l’intérieur du LAN, ou d’un appareil mobile (ici Chrome + Android) connecté à office online, l’expérience utilisateur est maintenant la même, quelque soit l'environnement (pas de prompt, Windows intégré dans notre cas) image025

Comment ça marche

Cf https://msdn.microsoft.com/en-us/library/azure/dn879065.aspx image026
  1. L’utilisateur tape l’url du site SharePoint
  2. AAD proxy fait de la pré-auth : si vous êtes déjà connecté online, on obtient un jeton, sinon il vous prompte pour votre profil online.
  3. Dans tous les cas, le jeton obtenu est envoyé au proxy.
  4. Le connecteur extrait du jeton l’UPN (lidentifiant utilisateur)
  5. Le connecteur fait une demande de jeton Kerberos de la part de l’utilisateur
  6. Si la delegation est autorisée, le jeton est émis.
  7. Le connecteur envoie alors la requete et son jeton comme si on était “interne"
  8. La page est renvoyée au navigateur
Il est également possible de customiser le ticket kerberos pour que le login arrivant sur l’application ne soit pas l’email, ou soit un login différent du login online (typiquement pour se connecter à un système non Windows) : image027 Sur ce schéma, je me connecte entant que joe@contoso.com à 365, mais j’arrive en tant que Contoso\joed sur l’application ciblée par ce connecteur.

Tuesday, March 11, 2014

Managed meta data service marked as "stopped" after Sharepoint 2013 SP1

$sa = Get-SPServiceApplication | where {$_.TypeName -eq "Managed Metadata Service"} $sa.provision() Will re-enable it. Happened to me twice while patching dec. CU --> SP1.

Friday, May 31, 2013

Vue en mode feuille de données (activeX)

Encore ce problème... :) Recap : si pas accesss sur la machine, downloader le runtime access 2007. (gratuit) Sinon, reparer office qui contient access. Sinon, supprimer la clef. La clef est “HKLM\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{65BCBEE4-7728-41A0-97BE-14E1CAE36AAE}” Que l’on trouve sur http://technet.microsoft.com/fr-fr/library/cc262506(v=office.12).aspx,  STSLIST.DLL Feuille de données de liste Microsoft Office 12 Pour le mécanisme, http://support.microsoft.com/kb/240797 Un correctif de sécurité ou un composant office 2003 désactive explicitement cette version de composant, par contre je ne sais pas lequel.

Friday, March 15, 2013

CONFIGURATION DE LA TOPOLOGIE DE RECHERCHE SHAREPOINT 2013

Les GEDs SharePoint dépassent couramment le million de documents. Dans ce contexte, il faut créer (au moins) deux indexeurs en équilibre de charge, ce qui nous permettra en plus d’offrir de la tolérance de panne. 1. Préambule La source d’info : On retrouve logiquement une grande partie du paramétrage de fast sur http://technet.microsoft.com/fr-fr/library/jj219705.aspx Les prérequis : Pas de tests en prod ! - Deux serveurs SharePoint 2013 sur lesquels on n’a pas encore crée de service de recherche (de toute façons, vous ne voulez pas du wizard pour une install en production ;) o Le service de recherche ne doit pas être démarré sur les autres nœuds. Si oui, il faut faire un STOP service( ?) - Un répertoire local de stockage sur chaque serveur ou (mieux) plusieurs répertoires sur un espace partagé. Ils doivent exister et êtres vides. o Sur ces répertoires, le compte de ferme doit avoir le contrôle. Ceci se fait en accordant une permission au groupe local WSS_ADMIN_WPG qui le contient. o Un bug fait que les répertoires sont testés localement sur le serveur ou on lance le script. Ils doivent donc être tous être crées sur ce nœud si le stockage est local. - Classiquement : o Ouvrir une session avec le compte d’Install de la ferme o Lancer Powershell en mode administrateur Si vous avez créé un service de recherche avec une topologie incorrecte, ou que le script échoue, une chance, dropper un service applicatif prend deux lignes  $spapp = Get-SPServiceApplication -Name "Search Service Application" Remove-SPServiceApplication $spapp -RemoveData A faire avant chaque tentative. Gardez aussi à l’esprit que l’ordonnanceur interne de SharePoint n’est pas en temps réel, il vaut mieux donc attendre 5 mn avant de relancer le script au cas où un job serait encore dans la file du SPTIMER. 2. Les rôles On doit répartir les rôles query, admin, stats et content sur nos deux nœuds. Dans mon exemple, je suivrais la matrice suivante : ROLE SPIDX1 (Principal) SPIDX2 (Backup) CRAWL X X ADMIN X CONTENT X X STATS X QUERY X X 3. Les partitions - Le minimum pour l’équilibrage est deux partitions (0/1) - Le minimum pour la tolérance de panne est de découper en un maitre et un replica pour chaque partition (0/1 répliqué en 1/0) On aura donc quatre composants Index. 4. Le script Partant de cette configuration, on peut commencer à écrire le script : J’ai utilisé la nomenclature du technet. # RAZ! # Supprime le service applicatif et les BDD existantes $spapp = Get-SPServiceApplication -Name "Search Service Application" Remove-SPServiceApplication $spapp -RemoveData #============================================================== #Configuration Search Service Application (SSA) #============================================================== $SearchApplicationPoolName = "SearchAdminApplicationPool" $SearchApplicationPoolAccountName = "SP2013\SP_SEARCH" $SearchServiceApplicationName = "Search Service Application" $SearchServiceApplicationProxyName = "Search Service Application Proxy" $DatabaseInstance = "SQL2012\SPSQL2013" $DatabaseName = "Sharepoint2013_SearchService" #Nom des serveurs d’index $App1 = “SPIDX1” $App2 = "SPIDX2" #Reps Exemples. Attention à mettre deux reps differents en Stockage partagé! $IndexLocationServer1 = "D:\IDX_HostA" $IndexLocationServer2 = "D:\IDX_HostB" # Création des reps (avec le bug local) New-Item -Path "\\SPIDX1\d$\IDX_HOSTA" -type directory -force New-Item -Path "\\SPIDX1\d$\IDX_HOSTB" -type directory -force New-Item -Path "\\SPIDX2\d$\IDX_HOSTB" -type directory -force   #============================================================== # Création du Pool s’il n’existe pas #============================================================== Write-Host -ForegroundColor DarkGray "Test – Pool SSA" $SPServiceApplicationPool = Get-SPServiceApplicationPool -Identity $SearchApplicationPoolName -ErrorAction SilentlyContinue if (!$SPServiceApplicationPool) { Write-Host -ForegroundColor Yellow "Création – Pool SSA" $SPServiceApplicationPool = New-SPServiceApplicationPool -Name $SearchApplicationPoolName -Account $SearchApplicationPoolAccountName -Verbose } #============================================================== #Search Service Application #============================================================== Write-Host -ForegroundColor DarkGray "Test - SSA" $SearchServiceApplication = Get-SPEnterpriseSearchServiceApplication -Identity $SearchServiceApplicationName -ErrorAction SilentlyContinue if (!$SearchServiceApplication) { Write-Host -ForegroundColor Yellow "Création - SSA" $SearchServiceApplication = New-SPEnterpriseSearchServiceApplication -Name $SearchServiceApplicationName -ApplicationPool $SPServiceApplicationPool.Name -DatabaseServer $DatabaseInstance -DatabaseName $DatabaseName } Write-Host -ForegroundColor DarkGray "Test - SSA Proxy" $SearchServiceApplicationProxy = Get-SPEnterpriseSearchServiceApplicationProxy -Identity $SearchServiceApplicationProxyName -ErrorAction SilentlyContinue if (!$SearchServiceApplicationProxy) { Write-Host -ForegroundColor Yellow "Création - SSA Proxy" New-SPEnterpriseSearchServiceApplicationProxy -Name $SearchServiceApplicationProxyName -SearchApplication $SearchServiceApplicationName } #============================================================== # Démarrer le service – IDX1 #============================================================== $HostA = Get-SPEnterpriseSearchServiceInstance -Identity $App1 Write-Host -ForegroundColor DarkGray "Test – SSI 1" if($HostA.Status -ne "Online") { Write-Host -ForegroundColor Yellow "Démarrage – SSI 1" Start-SPEnterpriseSearchServiceInstance -Identity $HostA While ($HostA.Status -eq "Online") { Start-Sleep -s 5 } Write-Host -ForegroundColor Yellow "SSI 1 Démarré" } #============================================================== # Démarrer le service – IDX2 #============================================================== $HostB = Get-SPEnterpriseSearchServiceInstance -Identity $App2 Write-Host -ForegroundColor DarkGray " Test – SSI 2" if($HostB.Status -ne "Online") { Write-Host -ForegroundColor Yellow " Démarrage– SSI 2" Start-SPEnterpriseSearchServiceInstance -Identity $HostB While ($HostB.Status -eq "Online") { Start-Sleep -s 5 } Write-Host -ForegroundColor Yellow "SSI 2 Démarré" } #============================================================== # Créer une nouvelle topologie vide pour pouvoir la modifier, et la remplir. #============================================================== $InitialSearchTopology = $SearchServiceApplication | Get-SPEnterpriseSearchTopology -Active $NewSearchTopology = $SearchServiceApplication | New-SPEnterpriseSearchTopology #============================================================== # Composants IDX1 : Stats, Index, Crawl, Admin, Query #============================================================== New-SPEnterpriseSearchAnalyticsProcessingComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $HostA New-SPEnterpriseSearchContentProcessingComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $HostA New-SPEnterpriseSearchCrawlComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $HostA New-SPEnterpriseSearchAdminComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $HostA New-SPEnterpriseSearchQueryProcessingComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $HostA #============================================================== # Composants IDX2: Index, Crawl, Query (noeud de backup) #============================================================== New-SPEnterpriseSearchContentProcessingComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $HostB New-SPEnterpriseSearchCrawlComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $HostB New-SPEnterpriseSearchQueryProcessingComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $HostB #============================================================== # Création de deux indexs, deux partitions = 4 replicas # spécifier les répertoires permet d'éviter de le stocker dans "Office Servers..." # A = 0/1 B= 1/0 #============================================================== New-SPEnterpriseSearchIndexComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $HostA -IndexPartition 0 -RootDirectory $IndexLocationServer1 New-SPEnterpriseSearchIndexComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $HostB -IndexPartition 1 -RootDirectory $IndexLocationServer2 New-SPEnterpriseSearchIndexComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $HostA -IndexPartition 1 -RootDirectory $IndexLocationServer1 New-SPEnterpriseSearchIndexComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $HostB -IndexPartition 0 -RootDirectory $IndexLocationServer2 #============================================================== # Enregistrement de la topologie #============================================================== Write-Host -ForegroundColor Yellow "Enregistrement tolologie" Set-SPEnterpriseSearchTopology -Identity $NewSearchTopology #============================================================== # Suppression de l’ancienne #============================================================== Write-Host -ForegroundColor DarkGray "Suppression tolologie.old" Remove-SPEnterpriseSearchTopology -Identity $InitialSearchTopology -Confirm:$false Write-Host -ForegroundColor Yellow "Supprimée" #============================================================== #Check Search Topology #============================================================== Get-SPEnterpriseSearchStatus -SearchApplication $SearchServiceApplication -Text Write-Host -ForegroundColor Yellow "Topologie configurée!" 5. Résultat attendu : On peut aussi tester en ligne de commande par, par exemple, Get-SPEnterpriseSearchStatus –SearchApplication « Serch Service Application" Emmanuel ISSALY Architecte Infrastructure Sharepoint MCNEXT

Thursday, February 28, 2013

Erreurs de certificats - CRL

Bonjour, Si vous constatez un délai persistant à chaque chargement d’une appli (typiquement en lançant stsadm, ça met 30 secondes à répondre) C’est normal en production : chaque dll signée est vérifiée par .NET (en java c’est pareil) sur un site de révocation au cas où elle serait compromise. Si la connexion est coupée, on se prend des timeouts systématiques. Un site .NET peut ainsi mettre plus d’une minute à démarrer (sans parler du stsadm qui se prend les 30 secondes à chaque fois) Solution brutale, mettre « 127.0.0.1 crl.microsoft.com » dans le fichier hosts de la machine (ou un tag dans les web.config). Attention, plus de vérifications du tout alors. Ne pas faire en production avec des composants signés tierce partie. Cela génère également des warnings dans les logs, surtout en SharePoint 2013. Il vaut mieux donc enregistrer au moins les certifs pour les composants SharePoint. (si le certificat d’une dll est présent en local, .NET ne va pas essayer de le checker sur un site) Je préfère cette donc dernière méthode, que l’on exécute comme suit : 1. Obtain the “SharePoint Root Authority” certificate as a physical (.cer) file a. Launch the SharePoint 2010 PowerShell window as Administrator b. $rootCert = (Get-SPCertificateAuthority).RootCertificate c. $rootCert.Export("Cert") | Set-Content C:\SharePointRootAuthority.cer -Encoding byte 2. Import the “SharePoint Root Authority” certificate to the Trusted Root Certification store a. Start | Run | MMC | Enter b. File | Add/Remove Snap-in c. Certificates | Add | Computer account | Next | Local computer | Finish | OK d. Expand Certificates (Local Computer), expand Trusted Root Certification Authorities e. Right-click Certificates > All tasks > Import f. Next | Browse | navigate to and select C:\SharePointRootAuthority.cer | Open | Next | Next | Finish | OK Manip avec copies d’écran : http://www.sharepointblues.com/2012/01/09/sharepoint-certificate-errors/ KB officielle : http://support.microsoft.com/kb/2639348

Friday, September 21, 2012

Vignettes AD <-> Profile

la KB officielle ; introduit en octobre 2010 http://support.microsoft.com/kb/2394320 Consider the following scenario. You try to import pictures in a user profile from the Active Directory thumbnailPhoto attribute to the PictureURL attribute in Microsoft SharePoint Server 2010. You set up an import PictureURL mapping. Then, you perform a full synchronization in the SharePoint server. In this scenario, the pictures are not added to the user profile in the SharePoint server. Note You can use following command to perform the import operation: Update-SPProfilePhotoStore -CreateThumbnailsForImportedPhotos 1 -MySiteHostLocation http:///my

Monday, August 27, 2012

Article exceptionnel sur le blobcache

http://sharepointinterface.com/2011/02/21/client-server-interactions-and-the-max-age-attribute-with-sharepoint-blob-caching/

Thursday, July 19, 2012

Synchro issues / Profiles

cet article est extremement exhaustif : http://blogs.technet.com/b/nishants/archive/2010/08/23/troubleshooting-user-profile-sync-issues-in-office-sharepoint-server-2007.aspx

Thursday, May 10, 2012

Diag des Alertes

http://blogs.developpeur.org/themit/archive/2012/05/08/sharepoint-mes-alertes-ne-marchent-pas-que-faire-comment-r-parer-ou-agir.aspx

Tuesday, April 17, 2012

tester du HTML dans une page sharepoint

pour reproduire un bug intermittent $req=[system.Net.HttpWebRequest]::Create($url); $req.UseDefaultCredentials = $true $response = $req.GetResponse() $stream = $response.GetResponseStream() $reader = New-Object IO.StreamReader($stream) $html = $reader.ReadToEnd() IF ($html -match "banner-aew-europe.jpg") { … Bug actif ….}

Wednesday, April 11, 2012

Webpart Derniers documents d'un site

Elegant, standard, avec une doc. http://www.fiechter.eu/blog/Lists/Posts/Post.aspx?ID=19&mobile=0

Monday, March 19, 2012

Dungeon master!

pour les nostalgiques, http://www.grimrock.net :)

Thursday, March 8, 2012

FEB CU 2010

http://blogs.technet.com/b/stefan_gossner/archive/2012/03/07/february-2011-cu-for-sharepoint-2010-has-been-released.aspx

Tuesday, March 6, 2012

Supprimer un profil local

Force sharepoint à le recreer :

#Get Site Collection
$SPsite = Get-SPSite "http://monportail"
#$OpenWeb = $SPSite.OpenWeb($SiteCollection)
$user = "Domaine\user"

$OpenWeb = $SPSite.RootWeb

$User = $OpenWeb.SiteUsers | Where {$_.LoginName -eq $User}
IF ($user)
{ $OpenWeb.SiteUsers.Remove($User)
Write-Host "$User Supprimé: $Site/$SiteCollection" }
else
{Write-Host "Non trouvé"}
$OpenWeb.Dispose()
$SPSite.Dispose()

Wednesday, February 22, 2012

Script inventaire / monitoring V2 - Sharepoint 2007 et 2010

Pour rappel, le principe est de remplir une liste SharePoint automatiquement (tache planifiée) avec tous les sites crées sur le serveur (inventaire) et leur état (monitoring). Ceci inclus les bases de contenu et leur instance SQL. Egalement, on filtre les sites persos, le site de cache officewebapps pour une liste plus claire :


Le code powershell est un peu approximatif, remarques bienvenues.


#
# Code : Emmanuel ISSALY - version 1.4 - 23/02/2012
# modèle objet Sharepoint --> marche en 2007 (sinon les commandlets sharepoint 2010 sont mieux)
#

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") > $null;

function get-webpage([string]$url,[System.Net.NetworkCredential]$cred=$null)
{
$wc = new-object net.webclient
if($cred -eq $null)
{
$cred = [System.Net.CredentialCache]::DefaultCredentials;
}
$wc.credentials = $cred;
return $wc.DownloadString($url);
}

#credentials windows par défaut

$cred = [System.Net.CredentialCache]::DefaultCredentials;
#$cred = new-object System.Net.NetworkCredential("username","password","machinename")

# liste sharepoint qui va stocker les infos
$docliburl="http://vpt--02.ds.cdcam.com:22222/Lists/SiteState";

$reportsite=new-object Microsoft.SharePoint.SPSite($docliburl);
$reportweb=$reportsite.openweb();
$reportlist=$reportweb.GetList($docliburl);

# Pour chaque AAM de type "default" (shell de stsadm)
set-alias stsadm -value "stsadm.exe"

# Motifs URL indésirables (cache office webapps, sites persos)
$filtre= @("Office_","perso/")

[xml]$x=stsadm -o enumzoneurls
foreach ($zone in $x.ZoneUrls.Collection) {

write-host + $zone.default;

[xml]$sites=(stsadm -o enumsites -url $zone.Default) -notmatch [String]::Join('|',$filtre)

foreach ($site in $sites.Sites.Site) {

write-host +++ $site.Url;
if (!$site.url) { Continue } # pas de droits sur la base de contenu

# obtenir instance SQL

$DBName = [Microsoft.SharePoint.Administration.SPContentDatabase].GetProperty("Name")
$DBServer= [Microsoft.SharePoint.Administration.SPContentDatabase].GetProperty("ServiceInstance")

$rootSite = New-Object Microsoft.SharePoint.SPSite($site.Url)
$ContentDBCollection = $rootSite.WebApplication.ContentDatabases ;

foreach($ContentDB in $ContentDBCollection)
{
$nom = $DBName.GetValue($ContentDB, $null)
$server = ($DBServer.GetValue($ContentDB, $null)).NormalizedDataSource
}

# write-host $server "\\" $nom ;

# Pas de fuite mémoire
$rootSite.Dispose();

#recherche l'url dans la liste
$item = $reportlist.Items | Where { $_["Title"] -eq $site.url }

# crée la ligne si n'existe pas
if ($item -eq $null) {$item = $reportlist.Items.Add();}

$item["Title"] = $site.url;
$item["OKN2?"]= $True;
$item["Erreur2"]="";
$item["ContentDatabase"]=$nom ;
$item["SqlInstance"] = $server;

trap
{
write-host $error[0].exception.innerexception.message -foregroundcolor red -backgroundcolor yellow
$item["OKN2?"]= $False;
$item["Erreur2"]= $error[0].exception.innerexception.message;
continue;
}

$html=get-webpage -url $site.Url -cred $cred;

$item.Update();

}
}

$reportweb.dispose()
$reportsite.dispose()

Monday, February 13, 2012

ping -t pour sharepoint, version ferme

trivial... penser à déclarer un AAM avec le nom de la machine (ici par exemple sur le port 81) pour isoler un noeud, et mettre en tache planifiée tous les x minutes :

function Test-Site
{ param($URL)
try
{
$webclient = New-Object Net.WebClient
# Proxy avec le compte "windows"
$webclient.Credentials = [System.Net.CredentialCache]::DefaultCredentials
if($webclient.Proxy -ne $null) {
$webclient.Proxy.Credentials = `
[System.Net.CredentialCache]::DefaultNetworkCredentials
}
# test
$webclient.DownloadString($URL) | Out-Null
}

Catch
{
"FAIL: $($_.Exception.innerexception.message)"
Send-mailmessage -to "emmanuel.issaly@am.wtfbbq.com" -from "sharepoint.prod@wtfbbq.com" -subject "wtfbbqportal ne répond pas!" -body "FAIL: $($_.Exception.innerexception.message)" -smtpserver "SMTP.wtfbbq" -priority high
exit 1
}

}

Write-host N1 OK T=(Measure-Command {test-site "http://vpt-wtfbbq-01:81/"}).TotalSeconds
Write-host N2 OK T=(Measure-Command {test-site "http://vpt-wtfbbq-02:81/"}).TotalSeconds


PS : pour en faire un ping -t, encadrer les deux lignes de test par un while(1) par exemple...

Friday, February 10, 2012

Word starter et windows 7 - "imprimante non installée"

Sur le portable de ma fille, word starter (et uniquement word starter) ne peut pas imprimer, message "imprimante non installée"

C'est un problème de sécurité. Baisser ou désactiver l'UAC, en attendant d'installer open office ^^

Thursday, February 9, 2012

Pensez à heriter vos providers sous IIS7 !

dans IIS7, une declaration au miveau machine( par exemple une chaine de connexion) se retrouve partout.
Particulièrement utile quand on vous demande de modifier la CA, le STS et une webapp pour un accès FBA...

par exemple si on crée une connection au niveau racine (serveur)



On la retrouve dans chaque Site (Inherited)



Du coup, une seule manip.

Alternative, dans le web.config du bon framework, C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG, taper les chaines.

PS: Evidamment, si on a plusieurs providers, ca peu perdre de son interet...

edit : en complement, il y a par défaut une balise dans la section providers du ststoken.... il faut alors ajouter les providers à la main.