Le blog technique

Toutes les astuces #tech des collaborateurs de PI Services.

#openblogPI

Retrouvez les articles à la une

O365 : Réaliser un hard match

 

Comme expliqué dans l’article précédent « O365 : Soft Match (SMTP) et Hard Match (ImmutableID) » le Hard Match intervient lorsque le Soft Match n’a pas fonctionné.

Les étapes à suivre sont les suivantes:

  1. Récupérer le GUID du compte dans l’Active Direcotry
  2. Convertir ce dernier en ImmutableID
  3. Appliqué cet ImmutableID au compte Azure Active Directory
  4. Relancer une synchronisation via Ad connect 

Voici donc les commandes pour cela.

# Get GUID for User
$User = Get-ADUser jdupont | select ObjectGUID,UserPrincipalName
$Upn = $User.UserPrincipalName
$Guid = $User.ObjectGUID.Guid

# Convert GUID to ImmutableID
$ImmutableId = [System.Convert]::ToBase64String(([GUID]($User.ObjectGUID)).tobytearray())

# Connect MsolService
Connect-Msolservice

# Set ImmutableID to msoluser
Set-MsolUser -UserPrincipalName $Upn -ImmutableId $ImmutableId

 

Et voila, vous n’avez plus qu’a relancer une Synchor AD Connect via la commande suivante.

Start-ADSyncSyncCycle -PolicyType Delta

 

 

Powershell : Who’s the owner of my AD objects

Lors de la création d’un objet Active Directory, un propriétaire est inscrit dans l’attribut « Security Descriptor » ce dernier dépend de « qui » a créé le compte.

 

  • Dans un AD sans délégation de droits d’administration.

Si l’utilisateur qui créé l’objet est membre du groupe :

  • « Enterprise Admins » et « Domain Admins » : Le propriétaire sera le groupe « Domain Admins« 
  • « Domain Admins » : Le propriétaire sera le groupe « Domain Admins« 

  • « Enterprise Admins » : Le propriétaire sera le groupe « Enterprise Admins« 

  • Dans un AD avec délégation de droits d’administration.

Lorsque l’on délègue les droits de création d’objets dans Active Directory, le compte utilisé pour créer des objets sera définit comme propriétaire de ces derniers.

Si par exemple je délègue la création d’objets de type « Users » au groupe « SG-Users-Management » et que le membre « Thomas DUPONT » créé un utilisateur, ce dernier sera propriétaire de l’objet utilisateur.

Si demain « Thomas DUPONT » n’est plus membre du groupe (pour n’importe quelle raison), il ne sera plus en mesure de créer / Modifier / Supprimer d’utilisateurs (jusque la tout va bien c’est ce que l’on désire), MAIS (et oui il y en a toujours un) ce ne sera pas vrai pour tous les objets créés par « Thomas DUPONT » précédemment.

Pourquoi ?

Et bien simplement parce que ne l’oublions « Thomas DUPONT » est le propriétaire des objets qu’il a créé, par conséquent il possède par défaut le droit de lecture et modification de l’objet.

Et donc ?

Ne l’oublions pas, le droit « Modify » permet de gérer les autorisations sur un objet, par conséquent il est donc possible pour « Thomas DUPONT » de se donner un droit « Full Control » sur ces objets.

Mais alors comment on identifie ces objets ?

Voici comment vérifier qui est le propriétaire des objets présents dans Active Directory.

  • Dans Active Directory Users and Computers

Comme nous l’avons vu plus haut il est possible via la console Active Directory Users and Computers de voir qui est le propriétaire d’un objet en passant par l’onglet « Security » puis « Advanced », mais bon pour un objet à la limite mais on va pas passer tous les objets à la main, c’est la qu’entre en jeu la seconde solution « Powershell ».

  • Avec powershell

 Avec Powershell, il suffit d’utiliser la commande « Get-Aduser » et de récupérer la propriété « nTSecurityDescriptor » 

$User = Get-ADUser mlemoine -Properties nTSecurityDescriptor

 Ok, mais on en fais quoi de ça me direz vous, c’est pas faux ça nous aide pas trop, alors complétons la commande comme suivant :

$User = Get-ADUser mlemoine -Properties nTSecurityDescriptor
$User.nTSecurityDescriptor.owner

C’est déjà mieux, mais si on vérifiait tout l’AD.

# Create Array
$Array = @()

# Collect AD infos
$Domain = Get-ADDomain | select -ExpandProperty NetBIOSName
$AllUsers = Get-ADUser -Filter * -Properties nTSecurityDescriptor

# Store Info
$AllUsers | foreach {
    $DistinguishedName = $_.DistinguishedName
    $GivenName = $_.GivenName
    $Name = $_.Name
    $ObjectClass = $_.ObjectClass
    $ObjectGUID = $_.ObjectGUID
    $SamAccountName = $_.SamAccountName
    $SID = $_.SID
    $Surname = $_.Surname
    $UserPrincipalName = $_.UserPrincipalName
    $nTSecurityDescriptor = $_.nTSecurityDescriptor
    
    
    $Array += New-Object psobject -Property @{
        DistinguishedName = $DistinguishedName
        GivenName = $GivenName
        Name = $Name
        Owner = $nTSecurityDescriptor.owner
        ObjectClass = $ObjectClass
        ObjectGUID = $ObjectGUID
        SamAccountName = $SamAccountName
        SID = $SID
        Surname = $Surname
        UserPrincipalName = $UserPrincipalName
        }
    
    $DistinguishedName = $null
    $GivenName = $null
    $Name = $null
    $nTSecurityDescriptor = $null
    $ObjectClass = $null
    $ObjectGUID = $null
    $SamAccountName = $null
    $SID = $null
    $Surname = $null
    $UserPrincipalName = $null
    $CurrentUser = $null
    $nTSecurityDescriptor = $null
    }

Bon maintenant qu’on a stocké les donnés, il faudrait les exploiter :

# How many Accounts were returns ?
Write-Host $Array.Count -ForegroundColor Yellow

# How many Accounts need to be reviewed ?
$NoGood = $Array.Where({(($_.Owner -ne "$Domain\Domain Admins") -and ($_.Owner -ne "$Domain\Enterprise Admins") -and ($_.Owner -ne "BUILTIN\Administrators"))})
Write-Host $NoGood.count -ForegroundColor Cyan

Apparement j’ai 12 comptes sur les 6031 de mon AD qui n’ont pas « Domain Admins », « Enterprise Admins » ou « Administrators » comme Owner, voyons voir cela.

$NoGood | ft Name,Owner

Ah, attention on voit bien que qu’il y a des objets liés à Exchange, je vais donc ajouter un filtre.

$Filter = $NoGood.Where({$_.Name -notlike "HealthMailbox*"})

Et voilà, je n’ai plus qu’un objet, super.

Il est possible d’appliquer la même mécanique aux éléments ci-dessous en modifiant la requête :

  • Unités d’Organisation
  • Groupes
  • Ordinateurs

 Unités d’Organisation

# Create Array
$Array = @()

# Collect AD infos
$Domain = Get-ADDomain | select -ExpandProperty NetBIOSName
$AllOU = Get-ADOrganizationalUnit -Filter * -Properties nTSecurityDescriptor

# Store Info
$AllOU | foreach {
    $City = $_.City
    $Country = $_.Country
    $DistinguishedName = $_.DistinguishedName
    $ManagedBy = $_.ManagedBy
    $Name = $_.Name
    $nTSecurityDescriptor = $_.nTSecurityDescriptor
    
    
    $Array += New-Object psobject -Property @{
        City = $City
        Country = $Country
        DistinguishedName = $DistinguishedName
        ManagedBy = $ManagedBy
        Name = $Name
        Owner = $nTSecurityDescriptor.owner
        }
    
    $City = $null
    $Country = $null
    $DistinguishedName = $null
    $ManagedBy = $null
    $Name = $null
    $nTSecurityDescriptor = $null
    }

# How many Accounts were returns ?
Write-Host $Array.Count -ForegroundColor Yellow

# How many Accounts need to be reviewed ?
$NoGood = $Array.Where({(($_.Owner -ne "$Domain\Domain Admins") -and ($_.Owner -ne "$Domain\Enterprise Admins") -and ($_.Owner -ne "BUILTIN\Administrators"))})
Write-Host $NoGood.count -ForegroundColor Cyan

 

Groupes

# Create Array
$Array = @()

# Collect AD infos
$Domain = Get-ADDomain | select -ExpandProperty NetBIOSName
$AllGroups = Get-ADGroup -Filter * -Properties nTSecurityDescriptor

# Store Info
$AllGroups | foreach {
    $DistinguishedName = $_.DistinguishedName
    $GroupCategory = $_.GroupCategory
    $GroupScope = $_.GroupScope
    $Name = $_.Name
    $ObjectClass = $_.ObjectClass
    $ObjectGUID = $_.ObjectGUID
    $SamAccountName = $_.SamAccountName
    $SID = $_.SID
    $nTSecurityDescriptor = $_.nTSecurityDescriptor
    
    
    $Array += New-Object psobject -Property @{
        DistinguishedName = $DistinguishedName
        GroupCategory = $GroupCategory
        GroupScope = $GroupScope
        Name = $Name
        ObjectClass = $ObjectClass
        ObjectGUID = $ObjectGUID
        SamAccountName = $SamAccountName
        SID = $SID
        Owner = $nTSecurityDescriptor.owner
        }
    
    $DistinguishedName = $null
    $DNSHostName = $null
    $Enabled = $null
    $Name = $null
    $ObjectClass = $null
    $ObjectGUID = $null
    $SamAccountName = $null
    $SID = $null
    $nTSecurityDescriptor = $null
    }

# How many Accounts were returns ?
Write-Host $Array.Count -ForegroundColor Yellow

# How many Accounts need to be reviewed ?
$NoGood = $Array.Where({(($_.Owner -ne "$Domain\Domain Admins") -and ($_.Owner -ne "$Domain\Enterprise Admins") -and ($_.Owner -ne "BUILTIN\Administrators"))})
Write-Host $NoGood.count -ForegroundColor Cyan

 

Ordinateurs

# Collect AD infos
$Domain = Get-ADDomain | select -ExpandProperty NetBIOSName
$AllComputers = Get-ADComputer -Filter * -Properties nTSecurityDescriptor

# Store Info
$AllComputers | foreach {
    $DistinguishedName = $_.DistinguishedName
    $GroupCategory = $_.GroupCategory
    $GroupScope = $_.GroupScope
    $Name = $_.Name
    $ObjectClass = $_.ObjectClass
    $ObjectGUID = $_.ObjectGUID
    $SamAccountName = $_.SamAccountName
    $SID = $_.SID
    $nTSecurityDescriptor = $_.nTSecurityDescriptor
    
    
    $Array += New-Object psobject -Property @{
        DistinguishedName = $DistinguishedName
        DNSHostName = $DNSHostName
        Enabled = $Enabled
        Name = $Name
        ObjectClass = $ObjectClass
        ObjectGUID = $ObjectGUID
        SamAccountName = $SamAccountName
        SID = $SID
        Owner = $nTSecurityDescriptor.owner
        }
    
    $DistinguishedName = $null
    $DNSHostName = $null
    $Enabled = $null
    $Name = $null
    $ObjectClass = $null
    $ObjectGUID = $null
    $SamAccountName = $null
    $SID = $null
    $nTSecurityDescriptor = $null
    }

# How many Accounts were returns ?
Write-Host $Array.Count -ForegroundColor Yellow

# How many Accounts need to be reviewed ?
$NoGood = $Array.Where({(($_.Owner -ne "$Domain\Domain Admins") -and ($_.Owner -ne "$Domain\Enterprise Admins") -and ($_.Owner -ne "BUILTIN\Administrators"))})
Write-Host $NoGood.count -ForegroundColor Cyan



MECM (SCCM) : Code d’erreur de séquences de tâches 0X80091007

Lors du déploiement du Master sur un ordinateur portable, la séquence de tâches SCCM a échoué avec le code d’erreur 0X80091007.

Cette séquence de tâches fonctionnait bien, mais cette erreur s’est produite sans aucune explication.

En regardant le fichier log « smsts.log » de la machine en question, il y a une ligne qui dit clairement que la séquence de tâche a échoué lors de l’installation de Microsoft Office 2013. Cependant, le package Office n’était pas corrompu. Ce problème avait donc une autre solution que la recréation du package.

Après une investigation plus approfondie du fichier log, il a révélé les erreurs ci-dessous :

Failed to run the action: Error in the task sequence.
Task Sequence Error Running: Install Microsoft Office 2013 Professional.
Install Microsoft Office 2013 Professional has failed with the error code (0x80091007).
The hash value is not correct. (Error: 80091007; Source: Windows)
For more information, please contact your system administrator or help-desk operator.

DownloadContentAndVerifyHash() failed. 80091007

En cherchant sur internet, le code d’erreur 0X80091007 se traduit par Hash Mismatch (The hash value is not correct).

Conclusion:

Il n’y avait pas de solution unique à cette erreur. Si vous rencontrez également le code d’erreur de séquence de tâches SCCM 0X80091007, essayez les solutions ci-dessous :

  • Supprimez le package du point de distribution et re-distribuez-le. C’est juste pour être sûr qu’un package valide est disponible avec le point de distribution
  • Vérifiez si la mémoire RAM installée est défaillante. Cette solution semble être la plus stupide. Mais, le remplacement de barrette RAM a résolu ce problème dans notre scénario.
  • Certaines personnes ont résolu l’erreur d’incompatibilité de hachage en désactivant la réplication différentielle binaire et en redistribuant le package à DP.

 

Dans notre scénario, problème détecté :

Barrette mémoire ram amovible défaillante. Elle est la source d’un problème de vérification de hash lors du téléchargement des sources de la séquence de tâches depuis MECM (DownloadContentAndVerifyHash() failed. 80091007)

Solution :

Enlever la barrette ram amovible et la remplacer par une nouvelle.