function New-RandomPassword { param ( [Parameter()] [int]$Length=12 ) $Password = "" for($i=0; $i -LT $Length ; $i++) { $Password = -join ($Password,[char]((46..46)+(48..57)+(65..90)+(97..122)|Get-Random)) } Return $Password }
jeudi 2 novembre 2023
New-RandomPassword
samedi 2 septembre 2023
Azure: Liste des utilisateurs pour des fins de contrôle
Le personnel de la conformité demande régulèrement une liste des utilisateurs avec certaines informations permettant d'évaluer si la gestion des utilisateurs est conforme aux politiques de l'entreprise.
Ce script produit un fichier qui pourra être importé dans Excel ou un autre outil de votre choix.
https://github.com/OS4Techno/os4tools/blob/main/AzureUserList.ps1
<# OS4 Techno, Services TI Inc. Septembre 2023 Purpose: Get information about user Repository: https://github.com/OS4Techno/OS4Tools #> $Properties = "AccountEnabled,` ID,` createdDateTime,` creationType,` deletedDateTime,` employeeHireDate, ` employeeLeaveDateTime, ` externalUserState, ` externalUserStateChangeDateTime,` lastPasswordChangeDateTime,` signInActivity,` DisplayName,` GivenName,` JobTitle,` UserPrincipalName,` UserType" $PropertiesOut = ("DisplayName",` "AccountEnabled",` "createdDateTime",` "creationType",` "deletedDateTime",` "externalUserState", ` "externalUserStateChangeDateTime",` "lastPasswordChangeDateTime",` "lastSignInDateTime",` "GivenName",` "JobTitle",` "UserPrincipalName",` "UserType") Connect-MgGraph -Scopes User.Read, User.ReadWrite, User.ReadBasic.All, User.Read.All, User.ReadWrite.All, Directory.Read.All, Directory.ReadWrite.All Select-MgProfile beta # SignInActivity not include in the version 1.0 $UserInformation = (get-mguser -All -property $Properties | Select-Object -Property $PropertiesOut -ExpandProperty SignInActivity -ErrorAction SilentlyContinue | Select-Object $PropertiesOut) $UserInformation | Export-csv -Path .\CloudUserList.CSV -Encoding utf8 -Delimiter ';' -UseQuotes AsNeeded Disconnect-MgGraph
mardi 29 août 2023
Microsoft Teams - Liste des équipes incluant les membres des canaux
Quand vient le temps de repenser les équipes dans Microsoft Teams, ça débute habituellement par faire le ménage. Ce script produit un fichier qui pourra être importé dans Excel ou un autre outil de votre choix.
https://github.com/OS4Techno/os4tools/blob/main/TeamsChannelMembership.ps1
<# OS4 Techno, Services TI Inc. August 2023 Purpose: Get the Teams Channels Membership with role Repository: https://github.com/OS4Techno/OS4Tools #> Connect-MicrosoftTeams $Teams = Get-Team $Out = @{} ForEach($G in $Teams) {ForEach($_ in (Get-TeamChannel -GroupId $G.GroupID)) {$Members = ((Get-TeamChannelUser -GroupId $G.GroupID -DisplayName $_.DisplayName) | Select-Object Name,Role) ForEach($M in $Members) { $Out.Add($G.DisplayName+";"+$_.Displayname+";"+$M.Name+";"+$M.Role,"") } } } $Out.Keys | Set-Content -Path .\TeamsMembers.csv
jeudi 13 juillet 2023
Exchange Online - Changer l'adresse SMTP par défaut - Ajouter des alias
Pour différentes raisons (fusion d'entreprises, changement du domaine principal,...) il peut s'avérer nécessaire de devoir changer l'adresse de courriel par défaut des utilisateurs. Voici les lignes de commandes à executer.
Connect-ExchangeOnline $MailboxesSMTP = (Get-EXOMailbox | Where-Object PrimarySmtpAddress -like '<Domain Name>') ForEach($_ in $MailboxesSMTP){ $FirstStep = $_.EmailAddresses.replace('SMTP:','smtp:') ;` $ActualSMTP = 'smtp:'+$_.UserPrincipalName; ` $DefaultSMTP = 'SMTP:'+$_.UserPrincipalName ; ` $SecondStep = $FirstStep.replace($ActualSMTP,$DefaultSMTP) Set-MailBox -identity $_.Identity -EmailAddresses $SecondStep}
Dans le même contexte, il peut être nécessaire d'ajouter des alias.
Connect-ExchangeOnline $AliasToApply = @( [PSCustomObject]@{ UserPrincipalName="User1@domain" Emails=@("smtp:User1@domain") }; [PSCustomObject]@{ UserPrincipalName="User2@domain" Emails=@("smtp:alias1@domain";"smtp:alias2@domain") } ) ForEach($_ in $AliasToApply) {$Mailbox = (Get-EXOMailbox -UserPrincipalName $_.UserPrincipalName) ; $Alias = $Mailbox.EmailAddresses ; ForEach($E in $_.Emails) {$Alias.Add($E); Set-Mailbox -Identity $MailBox.Identity -EmailAddresses $Alias}}
dimanche 28 mai 2023
Azure AD Connect - Retrait de domaine ProxyAddresses
Dans le contexte où les "mailboxes" d'un Tenant sont hébergés sur un serveur MS Exchange à l'interne (On-Premises) et qu'un domaine à retirer du Tenant est référencé dans les ProxyAddresses, il devient nécessaire de modifier les références au domaine dans les ProxyAddresses.
- Arrêter la synchronisation (Stop-ADSyncSyncCycle)
- Démarrer Synchronization Rules Editor
- Effectuer une copie (clone) de la règle (In-bound) In-From AD - User Common
- Désactiver l'originale
- Modifier la "Translation" ProxyAddresses dans la copie par:
RemoveDuplicates(Replace(Trim(ImportedValue("proxyAddresses")),"<domain-to-remove>",<dummy-domain>"))
- Démarrer la synchronisation (Start-ADSyncSyncCycle)
- Retirer le domaine du Tenant
- Arrêter la synchronisation
- Retourner dans le Synchronisation Rules Editor
- Effacer la copie
- Activer la règle originale.
- Démarrer la synchronisation
jeudi 5 janvier 2023
Endpoint Manager: Evaluation de la conformité des postes de travail
Dans un monde moderne, l'évaluation de la conformité d'un poste ne se limite pas à évaluer la version de Windows et ses rustines (patches). Il est souvent demandé que pour reconnaitre la conformité d'un poste de travail (endpoint) que certains logiciels soient installés.
Dans le contexte d'Endpoint Manager (Intune), il est possible de personnaliser certaines évaluations de la conformité à l'aide un script PowerShell qui récupère des informations sur le poste de travail et les comparent à un fichier JSON d'évaluation .
Dans l'exemple illustré, la présence des installations Darktrace et TrendMicro est évaluée.
L'évaluation pourra donner des résultats sous la forme suivante:
Le lien suivant vous donne accès au script PowerShell et le fichier JSON de cet exemple:
https://github.com/OS4Techno/EndpointManagerCompliance
vendredi 4 novembre 2022
Kusto: Utilisateurs authentifiés dans Azure AD mais que le "Device" ne se retrouve pas dans Intune
// Michel Caron
| where ClientAppUsed contains "Browser"
| extend String=tostring(DeviceDetail)
| extend DeviceName=extractjson("$displayName", String)
| where DeviceName != ""
| join kind=leftanti IntuneDevices on $left.DeviceName == $right.DeviceName
| distinct Location,DeviceName,UserDisplayName,UserPrincipalName
| order by Location,DeviceName
mardi 15 février 2022
Azure Site Recovery Services
Simplement un exemple d'utilisation du module Az.RecoveryServices pour gérer l'environnement Azure Site Recovery Services
$Vault = Get-AzRecoveryServicesVault # ajouter les paramètres pour précisier la "vault"
Set-AzRecoveryServicesAsrVaultContext -Vault $vault
$Fabric = Get-AzRecoveryServicesAsrFabric
$Container = Get-AzRecoveryServicesAsrProtectionContainer -Fabric $Fabric
Get-AzRecoveryServicesAsrReplicationProtectedItem -Protectioncontainer $Container |`
Format-Table FriendlyName,ProtectionState,ReplicationHealth,@{Label="Message";Expression={$_.ReplicationHealthErrors.ErrorMessage}}
jeudi 25 novembre 2021
Pour être aviser qu'une "Subscription" est maintenant attachée à un "Tenant"
$SubscriptionMigration = "" $TargetTenantID = "" For( $i = 0 ; (Get-AzSubscription -SubscriptionID $SubscriptionMigration -WarningAction SilentlyContinue).TenantID -NE $TargetTenantId ; $i++) {Write-Host "$i minute(s)" ; Start-Sleep -seconds 60}
mardi 16 novembre 2021
Démarrage rapide d'une sauvegarde des BDs MS SQL hébergées sur une VM Azure (PowerShell)
$Vault = Get-AzRecoveryServicesVault -Name <Vault Name> Get-AzRecoveryServicesBackupItem -BackupManagementType AzureWorkLoad -WorkLoadType MSSQL -VaultID $Vault.ID | Backup-AzRecoveryServicesBackupItem -BackupType Full -VaultID $Vault.ID
mardi 10 août 2021
Importation des adresses "Proxy" dans Active Directory
Dans certaines situations, comme lors de la migration de
"Tenant" Office 365, il peut s'avérer nécessaire de devoir récupérer
les valeurs contenues dans le champ "EmailAddresses" d'Exchange
Online et de les attribuer au champ "ProxyAddresses" d'Active Directory
pour éviter qu’Azure AD Connect altère le contenu du champ « EmailAddresses ».
Connect-ExchangeOnline $EXCHUsers = Get-MailBox ForEach($_ in $EXCHUsers) { $ProxyAddresses = $_.EmailAddresses ; ForEach($Address in $ProxyAddresses){Set-ADUser $_.SamAccountName.split()[0] -add @{'ProxyAddresses'=$Address}} }
samedi 3 avril 2021
Intune: Suivre les mises à jour Windows 10
Les différents rapports fournis avec Intune indiquent la version de Windows 10 installée avec le "Build Number". C'est assez facile à suivre quand pratiquement tous les équipements sont au même niveau. Par contrre, ça devient plus difficile à suivre quand certains équipements ont échapés au processus de mise à jour.
Pour y voir plus clair, il suffit d'ajouter une table qui contient les différentes versions de mises à jour (Il serait intéressant d'avoir accès à une table dynamique pour éviter une mise à jour mensuelle) dans les requêtes Kusto.
Exemple:
// Windows 10 // Pour suivre les mises à jour // Michel Caron // https://docs.microsoft.com/en-us/windows/release-health/release-information let Windows10Build = datatable (OSVersion: string, ReleaseDate: string)[ "10.0.19042.867", "20H2 2021-03-09", "10.0.19041.867", "2004 2021-03-09", "10.0.18362.1256", "1904 2020-12-08 EOS", "10.0.18363.1440", "1909 2021-03-09 EOS", "10.0.17134.2087", "1803 2021-03-09 EOS", ]; IntuneDevices | where TimeGenerated > ago(7d) | where OS startswith "Windows" | distinct UserName, DeviceName, OSVersion | lookup kind=leftouter Windows10Build on OSVersion | order by ReleaseDate
jeudi 25 mars 2021
WVD: Windows 10 Enterprise Multi-session avec Multi-languages
######################################################## ## Add Languages to running Windows Image for Capture## ######################################################## ##Disable Language Pack Cleanup## Disable-ScheduledTask -TaskPath "\Microsoft\Windows\AppxDeploymentClient\" -TaskName "Pre-staged app cleanup" ##Set Language Pack Content Stores## [string]$LIPContent = "Z:\multilanguages\LocalExperiencePack" ##French - Canada ## Add-AppProvisionedPackage -Online -PackagePath $LIPContent\fr-ca\LanguageExperiencePack.fr-ca.Neutral.appx -LicensePath $LIPContent\fr-ca\License.xml Add-WindowsPackage -Online -PackagePath $LIPContent\Microsoft-Windows-Client-Language-Pack_x64_fr-ca.cab Add-WindowsPackage -Online -PackagePath $LIPContent\Microsoft-Windows-LanguageFeatures-Basic-fr-ca-Package~31bf3856ad364e35~amd64~~.cab Add-WindowsPackage -Online -PackagePath $LIPContent\Microsoft-Windows-LanguageFeatures-OCR-fr-ca-Package~31bf3856ad364e35~amd64~~.cab Add-WindowsPackage -Online -PackagePath $LIPContent\Microsoft-Windows-LanguageFeatures-Speech-fr-ca-Package~31bf3856ad364e35~amd64~~.cab Add-WindowsPackage -Online -PackagePath $LIPContent\Microsoft-Windows-LanguageFeatures-TextToSpeech-fr-ca-Package~31bf3856ad364e35~amd64~~.cab Add-WindowsPackage -Online -PackagePath $LIPContent\Microsoft-Windows-NetFx3-OnDemand-Package~31bf3856ad364e35~amd64~fr-ca~.cab Add-WindowsPackage -Online -PackagePath $LIPContent\Microsoft-Windows-InternetExplorer-Optional-Package~31bf3856ad364e35~amd64~fr-ca~.cab Add-WindowsPackage -Online -PackagePath $LIPContent\Microsoft-Windows-MSPaint-FoD-Package~31bf3856ad364e35~amd64~fr-ca~.cab Add-WindowsPackage -Online -PackagePath $LIPContent\Microsoft-Windows-Notepad-FoD-Package~31bf3856ad364e35~amd64~fr-ca~.cab Add-WindowsPackage -Online -PackagePath $LIPContent\Microsoft-Windows-PowerShell-ISE-FOD-Package~31bf3856ad364e35~amd64~fr-ca~.cab Add-WindowsPackage -Online -PackagePath $LIPContent\Microsoft-Windows-Printing-WFS-FoD-Package~31bf3856ad364e35~amd64~fr-ca~.cab Add-WindowsPackage -Online -PackagePath $LIPContent\Microsoft-Windows-StepsRecorder-Package~31bf3856ad364e35~amd64~fr-ca~.cab Add-WindowsPackage -Online -PackagePath $LIPContent\Microsoft-Windows-WordPad-FoD-Package~31bf3856ad364e35~amd64~fr-ca~.cab $LanguageList = Get-WinUserLanguageList $LanguageList.Add("fr-ca") Set-WinUserLanguageList $LanguageList -force
dimanche 21 mars 2021
Active Directory rôles FSMO
Lors de testes de relève, ou une situation de relève, il est possible se retrouver dans une situation où un seul domaine contrôleur (DC) est disponible et ne possédant pas nécessairement tous les rôles FSMO (Flexible Simple Master Operation). Dans une telle situation, il suffit de lui transférer les 5 rôles FSMO en utilisant la commande NTDSUTIL.
En effectuant les commandes "Seize", des confirmations seront nécessaires. Des messages d'erreurs vont également apparaître car les commandes "Seize" effecutent une tentative de la commande "transfer" avant d'attribuer le rôle. Comme les autres DCs ne sont pas accessibles, les messages sont donc, "normaux".
La commande "netdom query fsmo" permet de valider que les rôles ont été transférés correctement.
samedi 20 mars 2021
Azure AD Connect: Changer l'ImmutableID d'un utilisateur
L’ImmutableID est une représentation en base 64 du GUID
associée à un utilisateur à l’intérieur d’Active Directory. Il arrive qu’il soit
nécessaire d’associer un utilisateur créé directement à l’intérieur d’Azure
Active Directory avec un utilisateur provenant d’Active Directory via Azure AD
Connnect.
La technique consiste à synchroniser l’utilisateur via Azure AD Connect, de saisir son ImmutableID, de suspendre la synchronisation, d’effacer l’utilisateur, d’associer l’ImmutableID à l’utilisateur cible et repartir la synchronisation.
Ces opérations s’effectuent à l’aide de commandes PowerShell.
Exemple :
Stop-ADSyncSyncCycle $ImmutableID = (Get-MsolUser -UserPrincipalName <SourceUserName@tenant.onmicrosoft.com>).ImmutableID Remove-MsolUser -UserPrincipalName <SourceUserName@tenant.onmicrosoft.com> Remove-MsolUser -UserPrincipalName <SourceUserName@tenant.onmicrosoft.com> -RemoveFromRecycleBin -Force Set-MsolUser -UserPrincipalName <TargetUserName@tenant.onmicrosoft.com> -ImmutableID $ImmutableID Start-ADSyncSyncCycle
Intune problème d'enrôlement (Enrollment Failure)
Dans le contexte où une GPO est utilisée pour le déploiement
autonome d’Intune, il arrive que pour différentes raisons le poste ne s’enregistre
pas (Enrollment).
Afin de trouver la ou les cause(s), il suffit d’utiliser les logs « IntuneOperationalLogs» et « SigninLogs ». Ce dernier va permettre de retrouver le nom de l’utilisateur car les entrées de «IntuneOperationalLogs » ne contiennent que l’identification de l’objet qui représente l’utilisateur. À l’aide d’une requête Kusto comme illustrée, il devient facile d’identifier la cause pour chacun des utilisateurs.
1 2 3 4 5 6 7 8 9 10 11 12 | // Intune Enrollment // Retrouver les utlisateurs avec l'échec d'enrôlement durant les derniers 5 jours IntuneOperationalLogs | where OperationName == "Enrollment" and TimeGenerated > ago(5d) | where Result == "Fail" | extend FailureReason=extractjson("$FailureReason", Properties) | extend IntuneUserId=extractjson("$IntuneUserId", Properties) | join SigninLogs on $left.IntuneUserId == $right.UserId | distinct Identity, FailureReason | order by Identity asc |
dimanche 14 mars 2021
Microsoft EMS (Enterprise Mobility + Security) - Sauvegardes - Surveillance
dimanche 21 février 2021
Azure Site Recovery (ExpressRoute)
Une manière assez simple d'utiliser Azure Site Recovery dans un contexte d'un réseau MPLS est d'implanter Azure ExpressRoute avec la configuration Private Peering.
mardi 9 février 2021
Microsoft System Center Configuration Manager (SCCM) - Co-management
SCCM 2010 après quelques recherches infructueuses pour trouver une solution pour activer l'option "Co-management" (Greyed Out), j'ai eu l'idée d'installer la console de gestion directement sur mon poste local au lieu de l'utiliser à partir du serveur où est installé SCCM. Résultat, l'option est maintenant disponible !
samedi 30 janvier 2021
Microsoft Defender for Identity (Sensor MDI)
Un de services fort intéressant de l'offre Microsoft Enterprise Mobility + Security E5 est la possibilité de mettre en place des agents (MDI Sensor) permettant d'identifier des situations pouvant compromettre la sécurité de l'entreprise.







