RDP 2012(R2) – session collection – profile disk – 800391163

En créant une collection de session sous Windows 2012/2012R2, et en spécifiant un partage pour stocker les profils, vous rencontrez l’erreur 800391163:

rdp2012_session_profile_disk_800391163

Lors de la configuration, un des serveurs RDP va créer le modèle de profil avec sont compte local système:

rdp2012_session_profile_disk_procmon

En détail:

rdp2012_session_profile_disk_procmon2

Bien que vous ayez donné les droits NTFS aux comptes ordinateurs, cela ne passe toujours pas.

Il faut donner « everyone » en « full control » au niveau du partage, « change » ne suffit pas:

rdp2012_session_profile_disk_share

Et voilà une affaire de résolue ^^

SharePoint – User profile – ResetSynchronizationDatabase : Operation is not valid due to the current state of the object

Problème

En voulant faire un reset de la base de synchronisation UPS de SharePoint, j’ai eu le message d’erreur suivant:

PS C:> $upa.ResetSynchronizationDatabase()
 Exception calling "ResetSynchronizationDatabase" with "0" argument(s):
 "Operation is not valid due to the current state of the object."
 At line:1 char:1
 + $upa.ResetSynchronizationDatabase()
 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
 + FullyQualifiedErrorId : InvalidOperationException

Solution

La base est en fait en miroir SQL. Au même moment, dans les journaux du serveur SharePoint:

event_5586

Il faut d’abord supprimer le miroir puis recommencer.

 

 

Spécialiste Microsoft, un avenir sombre ?

Cet article fait partie d’une série. Voici le premier !

 

J’imagine que l’actualité Microsoft ne vous aura pas échappée depuis quelques mois, et que Microsoft n’est plus seulement un « éditeur de logiciel ».

Bien que cet article porte particulièrement sur l’offre phare Office 365 de Microsoft, quelques nouvelles inquiétantes :

  • Microsoft soucieux d’apprendre comment Yammer (qui ne fait que du SaaS) fait pour livrer aussi souvent des nouveautés. L’intégration complète avec SharePoint et pour la version office365 pour l’instant.
  • Fin des abonnements Technet. Le « remplacement » proposé est d’utiliser les versions d’évaluations. On a tous le temps de réinstaller toute notre plateforme de test à intervalle régulière, c’est sûr. Sinon y a toujours MSDN, mais l’abonnement est autour de 6000€ pour avoir les mêmes droits. Pétition ici.
  • Windows 8.1/2012R2 est RTM mais n’est accessible qu’aux fabricants de matériels. Exit les Technet (qui l’ont encore), les MSDN et autres. Tout ce beau monde l’aura…en même temps que tout le monde.
  • Doublement du stockage sur Office 365 pour le même prix.
  • Fin des certifications MCM. Microsoft ne reconnaitra plus de « gourous » sur ses produits.

Microsoft a bien saisi les avantages de fournir du SaaS plutôt que de vendre ses solutions. Sauf que ce dernier a toujours reposé sur des partenaires pour compléter leurs offres et promouvoir leurs produits… Et des ingénieurs pour les déployer.

Bien que tout cela mette du temps avant d’impacter les admins/ingénieurs/experts/architectes utilisant fortement les technologies Microsoft, il vaut peut-être mieux anticiper un plan B « au cas où ».

Nagios: Superviser la santé Hyper-V 2012 – BPA & VM

Ce plugin Nagios vérifie la santé d’un serveur Hyper-V via un script PowerShell + NRPE (nsclient++):

  • Exécute et récupère le résultat du scan BPA (Best Practice Analyzer)
  • Vérifie que toutes les VM sont en cours d’exécution
  • Vérifie qu’aucune VM n’a un état de fonctionnement autre que normal

Les états avertissements et critiques sont déclenchés par la somme des:

  • Quantité d’alertes BPA
  • Nombre de VM dans un état autre que sain

Certaines VM (modèles…) peuvent être ignorées via un argument

Un nouveau scan BPA est lancé à chaque exécution, mais le résultat n’est récupéré que la fois suivante (async) (prend trop de temps).

Les données de performances suivantes sont fournies:

  • # VM arrêtées,
  • # VM avec problème de santé,
  • # Erreurs BPA
  • # Avertissements BPA

Configuration testée

Linux:

  • Centos 6.4 x64
  • Nagios 3.4.4
  • check_nrpe 2.13
  • Centreon 2.4.2

Windows:

  • Windows Server 2012 (nécessaire pour avoir le module PowerShell Hyper-V)
  • nsclient++ 0.4.1 x64

Arguments du script

  • excludeVM (séparées par des virgules)
  • maxWarn (Avertissement si supérieur) (1 par défaut)
  • maxError (Critique si supérieur) (5 par défaut)

maxWarn et maxCrit doivent être des entiers

Exemples d’utilisation

Exemple en exécution directe PowerShell:

PS C:Program FilesNSClient++scripts>. .lotp_check_hyper-v.ps1
WARNING: 'VM Not Running:'2 'VM issues:'0 BPA Error:1 BPA Warning:12|VM_Not_Running=2 VM_issues=0 BPA_Error=1 BPA_Warning=12
PS C:Program FilesNSClient++scripts>

Exécution NRPE:

[root~]# /usr/lib64/nagios/plugins/check_nrpe -H myMonitoredServer -n -c check_hyper-v
WARNING: 'VM Not Running:'2 'VM issues:'0 BPA Error:1 BPA Warning:12|VM_Not_Running=2 VM_issues=0 BPA_Error=1 BPA_Warning=12
[root~]#

Installation:

Sur les Windows:

  • Activer l’exécution de scripts PowerShell non signés : Set-ExecutionPolicy RemoteSigned
  • copier le script dans C:Program FilesNSClient++scripts
  • Ajouter dans le fichier nsclient.ini:
    • [/settings/external scripts/wrapped scripts]
      check_hyper-v=lotp_check_hyper-v.ps1 -excludeVM $ARG1$ -maxWarn $ARG2$ -maxError $ARG3$

Configuration:

Par exemple, sur Centreon, en ajoutant la commande:

$USER1$/check_nrpe -H $HOSTADDRESS$ -n -t 60 -c check_hyper-v -a $ARG1$ $ARG2$ $ARG3$

Téléchargement

lotp_check_hyper-v.ps1

Code source en direct:

 

# ====================================================================
# Ping a list of targets through NRPE
# Author: Mathieu Chateau - LOTP
# mail: mathieu.chateau@lotp.fr
# version 0.1
# ====================================================================

#
# Require Set-ExecutionPolicy RemoteSigned.. or sign this script with your PKI 
#

# ============================================================
#
#  Do not change anything behind that line!
#
param 
(
	[string]$targets,
	[int]$maxWarn = 1,
	[int]$maxError = 5
)

$output=""
$exitcode=2
$countOK=0
$countKO=0
$targetsArray=@()
$targetsArray=$targets -split(' ')
Remove-Job -Name * -Confirm:$false -Force
foreach($t in $targetsArray)
{
	Start-Job -Name $t -ArgumentList $t -ScriptBlock {param($t);if(Test-Connection -ComputerName $t  -Count 2 -Quiet -ErrorAction SilentlyContinue){return $true}else{return $false}} |Out-Null
}
while(Get-Job -State Running)
{
	Start-Sleep -Milliseconds 500
}
foreach ($job in Get-Job)
{
	$temp=Receive-Job -Name $job.Name
	if($temp)
	{
		$countOK++
	}
	else
	{
		$countKO++
		$output+=$job.Name+" - "
	}
}
if ($countKO -gt $maxError)
{
	$state="CRITICAL"
	$exitcode=2
}
elseif ($countKO -gt $maxWarn)
{
	$state="WARNING"
	$exitcode=1
}
else
{
	$state="OK"
	$exitcode=0
}

$output=$state+":"+$countOK+" online"+" - "+$countKO+" offline - "+$output
$output+='|'
$output+="online="+$countOK+";"+$maxWarn+";"+$maxError+";"+" "
$output+="offline="+$countKO+";"+$maxWarn+";"+$maxError+";"
Write-Host $output
exit $exitcode

dcdiag – VerifyEnterpriseReferences – msDFSR-ComputerReferenceBL – Q312862

En préparant un plugin nagios sur la santé AD, dcdiag /e /c a eu la bonne idée de remonter cette alerte:

Starting test: VerifyEnterpriseReferences

The following problems were found while verifying various important DN

references. Note, that these problems can be reported because of

latency in replication. So follow up to resolve the following

problems, only if the same problem is reported on all DCs for a given

domain or if the problem persists after replication has had

reasonable time to replicate changes. 

 [1] Problem: Missing Expected Value

Base Object: CN=myDC,OU=Domain Controllers,DC=mydomain,DC=net

Base Object Description: "DC Account Object"

Value Object Attribute Name: msDFSR-ComputerReferenceBL

Value Object Description: "SYSVOL FRS Member Object"

Recommended Action: See Knowledge Base Article: Q312862

 

L’article Q312862 n’est plus vraiment d’actualité, mais le problème sous-jacent est bien réel.

Depuis Windows 2008, la réplication AD est censée se faire via DFS-R et non plus FRS. Cependant, cela implique de n’avoir plus que des DC > Windows Server 2003.

Donc si vos DC sont à jours, il faut utiliser dfsrmig dont les principales commandes sont:

Vérifier l’état global:

PS C:usersmchateauDesktop> dfsrmig /GetGlobalState

Current DFSR global state: 'Start'

Succeeded.

Les différents états possibles sont:

0 'Start'
1 'Prepared'
2 'Redirected'
3 'Eliminated'

==>Si vous êtes déjà en DFS-R, l’état est Eliminated.

 

Vérifier l’état de la migration:

PS C:usersmchateauDesktop> dfsrmig /GetMigrationState

All domain controllers have migrated successfully to the Global state ('Start').
Migration has reached a consistent state on all domain controllers.
Succeeded.

 

Passer à l’état Prepared:

PS C:usersmchateauDesktop> dfsrmig /SetGlobalState 1

Current DFSR global state: 'Start'

New DFSR global state: 'Prepared'

Migration will proceed to 'Prepared' state. DFSR service will copy the contents of SYSVOL to SYSVOL_DFSR folder.
If any domain controller is unable to start migration, try manual polling.
Or run with option /CreateGlobalObjects.
Migration can start anytime between 15 minutes to 1 hour.
Succeeded.

 

Vérifier l’état (en cours):

PS C:usersmchateauDesktop> dfsrmig /GetMigrationState

The following domain controllers have not reached Global state ('Prepared'):

Domain Controller (Local Migration State) - DC Type
===================================================

myDC01 ('Start') - Writable DC
myDC02 ('Start') - Writable DC
myDC03 ('Start') - Primary DC
myDC04 ('Start') - Writable DC

Migration has not yet reached a consistent state on all domain controllers.
State information might be stale due to Active Directory Domain Services latency.
PS C:usersmchateauDesktop>

 

Il ne reste plus qu’à faire les 2 états suivants tour à tour:

dfsrmig /SetGlobalState 2
dfsrmig /SetGlobalState 3

 

Au final:

PS C:usersmchateauDesktop> dfsrmig /GetMigrationState
All domain controllers have migrated successfully to the Global state ('Eliminated').
Migration has reached a consistent state on all domain controllers.
Succeeded.

Nagios: multithreaded multi ping via nrpe

L’objectif de ce plugin est tester via ping plusieurs cibles depuis un serveur via nrpe. Ce n’est donc pas le serveur nagios, mais bien un serveur supervisé par celui-ci qui fait le test.

Le plugin est exécuté localement, appelé via NRPE (et donc nsclient++ par exemple).

Etant multi threadé, la vitesse d’exécution est presque constante (1.75s par cible en moyenne).

Configuration testée

Linux:

  • Centos 6.4 x64
  • Nagios 3.4.4
  • check_nrpe 2.13
  • Centreon 2.4.2

Windows:

  • Windows Server 2008 R2 / 2012
  • nsclient++ 0.4.1 x64 et x86
  • Serveurs Core et normaux

Arguments du script

  • targets (séparées par des virgules, obligatoire)
  • maxWarn (Avertissement si le nombre de cible offline est supérieur) (1 par défaut)
  • maxError (Critique si le nombre de cible offline est supérieur) (5 par défaut)

maxWarn et maxCrit doivent être des entiers

Exemples d’utilisation

Exemple en exécution directe PowerShell:

PS C:Program FilesNSClient++scripts>. .lotp_check_multiping.ps1 www.google.com,www.lotp.fr 1 2 
OK:2 online - 0 offline - |online=2;1;2; offline=0;1;2;
PS C:Program FilesNSClient++scripts>

Exécution NRPE:

[root~]# /usr/lib64/nagios/plugins/check_nrpe -H myMonitoredServer -n -c check_multiping -a www.google.com,www.lotp.fr 1 2
OK:2 online - 0 offline - |'online'=2;1;2 'offline'=0;1;2
[root~]#

Installation:

Sur les Windows:

  • Activer l’exécution de scripts PowerShell non signés : Set-ExecutionPolicy RemoteSigned
  • copier le script dans C:Program FilesNSClient++scripts
  • Ajouter dans le fichier nsclient.ini:
    • [/settings/external scripts/wrapped scripts]
      check_multiping=lotp_check_multiping.ps1 -targets $ARG1$ -maxWarn $ARG2$ -maxError $ARG3$

Configuration:

Par exemple, sur Centreon, en ajoutant la commande:

$USER1$/check_nrpe -H $HOSTADDRESS$ -n -t 60 -c check_multiping -a $ARG1$ $ARG2$ $ARG3$

Téléchargement

lotp_check_multiping.ps1

(enlever le .txt à la fin)

code source en direct:

# ====================================================================
# Ping a list of targets through NRPE
# Author: Mathieu Chateau - LOTP
# mail: mathieu.chateau@lotp.fr
# version 0.1
# ====================================================================

#
# Require Set-ExecutionPolicy RemoteSigned.. or sign this script with your PKI 
#

# ============================================================
#
#  Do not change anything behind that line!
#
param 
(
	[string]$targets,
	[int]$maxWarn = 1,
	[int]$maxError = 5
)

$output=""
$exitcode=2
$countOK=0
$countKO=0
$targetsArray=@()
$targetsArray=$targets -split(' ')
Remove-Job -Name * -Confirm:$false -Force
foreach($t in $targetsArray)
{
	Start-Job -Name $t -ArgumentList $t -ScriptBlock {param($t);if(Test-Connection -ComputerName $t  -Count 2 -Quiet -ErrorAction SilentlyContinue){return $true}else{return $false}} |Out-Null
}
while(Get-Job -State Running)
{
	Start-Sleep -Milliseconds 500
}
foreach ($job in Get-Job)
{
	$temp=Receive-Job -Name $job.Name
	if($temp)
	{
		$countOK++
	}
	else
	{
		$countKO++
		$output+=$job.Name+" - "
	}
}
if ($countKO -gt $maxError)
{
	$state="CRITICAL"
	$exitcode=2
}
elseif ($countKO -gt $maxWarn)
{
	$state="WARNING"
	$exitcode=1
}
else
{
	$state="OK"
	$exitcode=0
}

$output=$state+":"+$countOK+" online"+" - "+$countKO+" offline - "+$output
$output+='|'
$output+="online="+$countOK+";"+$maxWarn+";"+$maxError+";"+" "
$output+="offline="+$countKO+";"+$maxWarn+";"+$maxError+";"
Write-Host $output
exit $exitcode

SharePoint: The local farm is not accessible. Cmdlets with FeatureDependencyId are not registered

Top des possibilités:

  • le prompt Powershell n’est pas lancé en mode administrateur (prompt UAC)
  • Vous n’êtes pas administrateur local
  • Vous n’avez pas accès aux bases SQL. Le snapin doit se connecter à la base de configuration de la ferme.

Histoire de ne pas faire le post le plus court de l’année, vous pouvez vérifier avec Process Explorer si vous êtes vraiment administrateur (aka UAC elevated):

  • Deny : vous êtes membres mais UAC vous bloque. Il faut relancer en run as administrator
  • Owner: vous êtes bien administrateur avec UAC elevated. Donc c’est SQL le problème 😉

06-05-2013 22-52-21

06-05-2013 22-53-32

 

Nagios: Superviser les horloges Windows

L’objectif de ce plugin pour Nagios est de superviser l’heure sur les serveurs Windows non DC.

Les serveurs membres ne peuvent pas par défaut être interrogé en ntp comme les DC pour vérifier leur horloge.

J’utilise l’agent nsclient++ sur les serveurs afin de pouvoir exécuter des scripts PowerShell entre autre. On a donc:

Nagios => check_nrpe => script powershell => retour nagios

Cela fonctionne également sur les serveurs Core.

Si aucun serveur de référence n’est fourni, le script fonctionne ainsi:

  • Si un serveur de référence est fourni, utilisation de celui-ci
  • Sinon:
    • Si joint à un domaine, essaye de récupérer la variable logonserver. Si cela échoue, prend un DC au hasard. en cas d’erreur, essaye avec pool.ntp.org
    • Si n’est pas joint à un domaine, essaye avec pool.ntp.org

Fourni la « jigue » en temps que performance pour les graphes.

Configuration testée

Linux:

  • Centos 6.4 x64
  • Nagios 3.4.4
  • check_nrpe 2.13
  • Centreon 2.4.2

Windows:

  • Windows Server 2003 / 2008 R2 / 2012
  • nsclient++ 0.4.1 x64 et x86
  • Serveurs Core et normaux

Arguments du script

  • refTimeServer (AD find ou pool.ntp.org par défaut)
  • maxWarn (Avertissement si supérieur, en secondes) (1 par défaut)
  • maxError (Critique si supérieur, en secondes) (5 par défaut)

 

maxWarn et maxCrit doivent être des entiers

Exemples d’utilisation

Exemple en exécution directe PowerShell:

PS C:Program FilesNSClient++scripts> . .lotp_check_time.ps1 
OK:-00.0307684s - checked against pool.ntp.org|offset=-00.0307684s;1;5;
PS C:Program FilesNSClient++scripts>

Exécution NRPE:

[root~]# /usr/lib64/nagios/plugins/check_nrpe -H myserver -n -c check_time -a "myPDCServer" 1 5 
OK:+00.0671837s - checked against myPDCServer|'offset'=0.06718s;1;5
[root~]#

Installation:

Sur les Windows:

  • Activer l’exécution de scripts PowerShell non signés : Set-ExecutionPolicy RemoteSigned
  • copier le script dans C:Program FilesNSClient++scripts
  • Ajouter dans le fichier nsclient.ini:
    • [/settings/external scripts/wrapped scripts]
      check_time=lotp_check_time.ps1 -refTimeServer $ARG1$ -maxWarn $ARG2$ -maxError $ARG3$

Configuration:

Par exemple, sur Centreon, en ajoutant la commande:

$USER1$/check_nrpe -H $HOSTADDRESS$ -n -c check_time -a "$ARG1$" $ARG2$ $ARG3$

Téléchargement

(enlever le .txt à la fin)

lotp_check_time.ps1

 

# ====================================================================
# Check time against DC or specified server through NRPE / w32tm
# Author: Mathieu Chateau - LOTP
# mail: mathieu.chateau@lotp.fr
# version 0.1
# ====================================================================

#
# Require Set-ExecutionPolicy RemoteSigned.. or sign this script with your PKI 
#

# ============================================================
#
#  Do not change anything behind that line!
#
param 
(
	[string]$refTimeServer,
	[int]$maxWarn = 1,
	[int]$maxError = 5
)

$output=""
$exitcode=2
$random=
if(($refTimeServer -eq $null) -or ($refTimeServer -eq "") -or ($refTimeServer -eq " "))
{
	$refTimeServer=$env:LOGONSERVER -replace ('\',"")
	if(($refTimeServer -match "^$|^ $") -or ($env:LOGONSERVER -match $refTimeServer))
	{
		if((gwmi win32_computersystem).partofdomain -eq $true)
		{
			#Must use select and not .Name directly. If some DC are down, command will be empty with .Name
			$fromAD=(([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() | % { $_.DomainControllers }))| select Name 
			foreach ($entry in $fromAD)
			{
				if(($env:COMPUTERNAME -match $entry) -or ($entry -match $env:COMPUTERNAME))
				{
					#this server is a DC, can't check time against itself
					$fromAD.Remove($entry)
				}
			}
			if($fromAD.Count -gt 1)
			{
				#get a random DC from AD, as no server provided and no logon server could be found
				$refTimeServer=(Get-Random -InputObject $fromAD).Name
			}
			else
			{
				#only one DC, defaulting to internet
				$refTimeServer="pool.ntp.org"
			}
		}
		else
		{
			#Workgroup but no server to check time against provided. Defaulting to internet to do something
			$refTimeServer="pool.ntp.org"
		}
	}
}

if(($refTimeServer -eq $null) -or ($refTimeServer -eq "") -or ($refTimeServer -eq " "))
{
	#Something bad happened. Should never happen
	Write-Host "CRITICAL: can't auto detect logon server to check against. Need to specify manually using refTimeServer argument"
	exit 2
}

$temp=w32tm /stripchart /computer:$refTimeServer /period:1 /dataonly /samples:1
$temp=($temp | select -Last 1) -replace (".*, ","")
$temp=$temp -replace ("s$","")

if ($temp -match "^(+|-)[0-9]+.[0-9]+$")
{
	$output=$temp+"s - checked against "+$refTimeServer
	if ([math]::abs($temp) -gt $maxError)
	{
		$state="CRITICAL"
		$exitcode=2
	}
	elseif ([math]::abs($temp) -gt $maxWarn)
	{
		$state="WARNING"
		$exitcode=1
	}
	else
	{
		$state="OK"
		$exitcode=0
	}
}
else
{
	$output="Error: - used $refTimeServer as time server - output:$temp"
	$exitcode=2
}

$output=$state+":"+$output+$random+'|'+"offset="+$temp+"s"+";"+$maxWarn+";"+$maxError+";"
Write-Host $output
exit $exitcode