PowerShell ile Entra ID Kullanıcılarını Bulun


Posta Kutularını ve Entra ID Kullanıcı Hesaplarını Hedeflemek için Filtreleri Kullanın

PowerShell komut dosyaları genellikle işlenecek bir dizi Entra ID kullanıcı hesabı veya Exchange posta kutusu bularak başlar. Klasik yaklaşım, istenen nesneleri bulmak için Get-ExoMailbox veya Get-MgUser gibi bir cmdlet'i çalıştırmaktır. Ancak optimum seti bulmaya çalıştığınızda işler biraz karmaşık hale gelebilir. Örneğin:

  • Yalnızca kullanıcı posta kutuları (paylaşılan ve oda posta kutularını hariç tutun).
  • Yalnızca lisanslı hesaplar (Microsoft 365 hizmetlerini kullanmak için lisans atanan kullanıcı hesaplarına odaklanın).

İlk set aşağıdakilerle kolayca bulunur:

[array]$Mailboxes = Get-ExoMailbox -RecipientTypeDetails UserMailbox -ResultSize Unlimited

İkincisi şununla:

[array]$Users = Get-MgUser -Filter "assignedLicenses/`$count ne 0 and userType eq 'Member'" -ConsistencyLevel eventual -CountVariable Records -All -Property Id, displayName, AssignedLicenses

İkinci örneğin sözdizimi daha karmaşıktır çünkü kiracının üyesi olan (misafir olmayan) en az bir lisansa (sayım 0'dan büyük) sahip hesapları bulmak için bir Grafik filtresi kullanır. Bu aynı zamanda Microsoft'un Entra ID nesnelerine karşı gelişmiş bir sorgu olarak adlandırdığı şeydir; tutarlılık düzeyi parametresinin mevcut olmasının nedeni budur.

Sorun, paylaşılan posta kutuları ve oda posta kutuları tarafından kullanılan hesapların lisansa sahip olabilmesidir. Paylaşılan posta kutularının bir arşivi kullanmak veya posta kutusu kotasını artırmak için lisansa ihtiyacı vardır; oda posta kutularının ise Teams Rooms cihazları tarafından kullanıldığında lisansları vardır. Komut dosyanız mutlaka bu hesapları işlemek istemeyebilir çünkü amaç, odalar veya cihazlar yerine insanlara ait hesaplarla ilgilenmektir.

Paylaşılan posta kutuları ve oda posta kutuları dizisini oluşturduktan sonra, söz konusu dizide olmayan hesapları kaldırmak için kullanıcıların dizisini filtrelemek kolaydır:

[array]$NonUserAccounts = Get-ExoMailbox -RecipientTypeDetails SharedMailbox, RoomMailbox -ResultSize Unlimited | Select-Object UserPrincipalName, ExternalDirectoryObjectId
Write-Host "Removing non-user accounts from set to be processed..."
$Users = $Users | Where-Object {$_.Id -notin $NonUserAccounts.ExternalDirectoryObjectId}

Sonuç, insanlara ait lisanslı kullanıcı hesaplarını tutan bir dizidir. Bu tekniği senaryoda yöneticilerin ve onların doğrudan raporlarının bir HTML raporunu oluşturmak için kullanıyorum.

Çalışanlar için Kullanıcı Hesaplarını Bulun

Entra ID, çalışan verileri için çeşitli özellikler içerir. Üç önemli özellik şunlardır:

  • ÇalışanKimliği: Kuruluş tarafından atanan çalışan tanımlayıcısını içeren bir dize değeri. Çoğu zaman bu bir sayıdır.
  • EmployeeHireDate: Çalışanın kuruluşa katıldığı tarih değeri.
  • EmployeeType: Çalışanın türünü belirten bir dize değeri. Örneğin “Geçici”, “Kalıcı” ve “Yarı Zamanlı” gibi değerleri bu özellikte saklayabilirsiniz.

Çalışan öznitelikleri, Grafiğin döndürdüğü varsayılan kümenin parçası değildir. Niteliklere göre normal şekilde filtreleme yapabilirsiniz ancak verileri görmek istiyorsanız, Grafik isteğinde nitelikleri belirtmeniz gerekir. Örneğin, bu Get-MgUser komutu, özniteliğin değerini Grafiğin döndürdüğü verilere dahil etmeden, EmployeeId özniteliğinde bir değere sahip üye hesaplarını bulur. Bir alanla karşılaştırma, Grafikle çalışırken bilinmesi gereken zaaflardan biridir.

[array]$Employees = Get-MgUser -filter "userType eq 'Member' and EmployeeId ge ' '"
$Employees | Format-Table DisplayName, EmployeeId

DisplayName  EmployeeId
-----------  ----------
Rene Artois
Tony Redmond

Çalışan verilerini görmek için geri dönecek çağrının özelliklerini belirtin:

[array]$Employees = Get-MgUser -filter "userType eq 'Member' and EmployeeId ge ' '" -Property Id, displayname, userprincipalname, employeeid, employeehiredate, employeetype

$Employees | Format-Table DisplayName, EmployeeId, EmployeeType, EmployeeHireDate

DisplayName  EmployeeId EmployeeType EmployeeHireDate
-----------  ---------- ------------ ----------------
Rene Artois  111888     Permanent    08/03/2018 00:00:00
Tony Redmond 150847     Permanent    01/01/2011 00:00:00

Ne yazık ki Grafik, çalışan türüne veya çalışan işe alım tarihi özelliklerine göre filtrelemeyi desteklemiyor (referans için bu sayfaya bakın). İşe alma tarihine göre filtreleme yapmak istiyorsanız yukarıda gösterildiği gibi çalışan dizisini oluşturun ve istemci tarafı filtresini kullanın. Örneğin, bu kod son on yıl içinde işe alınan çalışanları bulur:

$CheckDate = (Get-Date).AddDays(-3650)
$Employees | Where-Object {$CheckDate -as [datetime] -lt $_.EmployeeHireDate}

Bu komut, kalıcı olarak işaretlenmiş çalışan türüne sahip hesapları bulur.

$Employees | Where-Object {$_.EmployeeType -eq "Permanent"}

PowerShell'de bulunan beğenme, eşleştirme ve diğer karşılaştırma işleçlerini kullanmak için istemci tarafında bir filtreye de ihtiyacınız olacak. Grafik istekleri, kullanıcı hesaplarını değerlendirirken eq, and, or ve startswith ile sınırlıdır.

Exchange Özel Niteliklerine Sahip Kullanıcı Hesaplarını Bulma

Entra ID'ye karşı herhangi bir sorgunun kullanılması, sorgulanan özelliklerde doğru verilerin bulunmasına bağlıdır. Deneyimlerime göre, nispeten az sayıda Microsoft 365 kiracısı Entra ID'de bulunan çalışan özelliklerini dolduruyor. Bunun nedeni, birçok kuruluşun hibrit olması veya çalışan özelliklerini kullanmamak için başka nedenlere sahip olması (mevcut olduklarını bilmemek gibi) ya da başka planların kullanımda olması olabilir. Örneğin, Active Directory ve Exchange Server kullanan kuruluşlar bazen özel (uzantı) öznitelikte bir değer depolayarak "insan" hesaplarını işaretler. Bu özellik, hesabın amacını belirtmek için Çalışan, Geçici, Danışman ve Hizmet Hesabı gibi değerleri saklayabilir. Bu örnek, insanlara ait hesapları işaretlemek için ExtensionAttribute2'nin “Employee”yi depoladığı lisanslı kullanıcı hesaplarını arar.

[array]$EmployeeAccounts = Get-MgUser -Filter "onPremisesExtensionAttributes/extensionAttribute2 eq 'Employee' and assignedLicenses/`$count ne 0 and userType eq 'Member'" -ConsistencyLevel eventual -CountVariable Records -All

Kuruluşunuz çalışan bilgilerini depolamak için Exchange özel niteliklerini kullanıyorsa, Exchange niteliklerini farklı bir amaç için kullanmak istemediğiniz veya kullanmanız gerekmediği sürece Entra ID niteliklerini kullanmaya geçmeniz için iyi bir neden yoktur. Geçiş yapmak, Exchange Online'daki özniteliklerin okunması ve bunları Entra ID'ye yazılması meselesidir, dolayısıyla basittir. Çalışan ayrıntılarının Exchange Online'dan alınmasını ve kullanıcının hesabına yazılmasını gösteren bazı basit kodları burada bulabilirsiniz. EmployeeType değeri CustomAttribute2'den alınırken, EmployeeHireDate değeri posta kutusunun oluşturulma tarihinden gelir.

[array]$Mailboxes = Get-ExoMailbox -RecipientTypeDetails UserMailbox -ResultSize Unlimited -Properties CustomAttribute2, WhenCreated
ForEach ($Mbx in $Mailboxes) {
   Update-MgUser -UserId $Mbx.ExternalDirectoryObjectId -EmployeeType $Mbx.CustomAttribute2 -EmployeeHireDate (Get-Date($Mbx.WhenCreated))
}

İşlemeyi Bölme

Bazen bir kuruluş o kadar çok hesaba yayılır ki, tüm hesapların getirilmesi uzun zaman alır. Bu durumlarda, hesapları uygun kümelere bölerek işlemleri bölebilirsiniz. Bazı insanlar departmanları işlemenin temeli olarak kullanır, bazıları ise ülkeleri kullanır. Bu örnekte lisanslı kullanıcı hesaplarını soyadına göre getiriyoruz. Şekil 1 sonucu göstermektedir.

[array]$Surnames = "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "W", "X", "Y", "Z"
ForEach ($S in $Surnames) {
  $Filter = "assignedLicenses/`$count ne 0 and userType eq 'Member' and startsWith(surname,('$S'))"
  [array]$Users = Get-MgUser -Filter $Filter -ConsistencyLevel eventual -CountVariable Records -All
  If ($Users) {
     Write-Host ("{0} users have surname starting with {1}" -f $Users.count, $S)
     Write-Host  "---------------------------------------------"
     $Users | Format-Table DisplayName, Surname
     Write-Host ""
 } Else {
     Write-Host ("No users found with surname starting with {0}" -f $S)
 }
}

Geçişin Parçası

Posta kutularını ve/veya kullanıcı hesaplarını bulmak için etkili çağrılar yapmak, bir PowerShell betiğinin oluşturulması veya bozulması olabilir. Kullanımdan kaldırılan Azure AD modülünden Grafik API'sine veya Grafik SDK komutlarına geçiş, çalışması daha zor olan ve standart PowerShell karşılaştırma işleçleri aracılığıyla sağlanan esnekliğin bir kısmından yoksun olan yeni bir filtre biçimi sunar. Grafiği kullanmak için komut dosyalarını güncellemek bazen zorlayıcı olabilir, ancak olaylara olumlu bakmanın yolu, kodun verimliliğini artırma şansı sunmasıdır. Bu, küçük ve orta ölçekli kuruluşlar için önemli bir şey değil ancak on binlerce hesabı veya posta kutusunu yönetirken büyük bir fark yaratıyor.

İlgili makaleler