Project Azure Azure_Users_SQL_Update
My design is set to pull and compare the ObjectID from the SQL table and AzueAD and only update records that are currently in the database table. I use a read only account that has to be set up to use Task Scheduler to connect to AzureAD that information is posted Here.
I use a Invoke-SQLCmd statement that allow the use of the Widows Account executing the script to login to SQL. This way I can use a one account assigned in Task Scheduler that has access to SQL and then an inline authentication in the script to access AzureAD.
#--------------Connect to SQL to Get List of Known Accounts by ObjectID---------------------
#Import the SQL Module & Query to Select Data All ObjectID
Import-Module "C:\Scheduled-Tasks\SQL_Module\SqlServer.psm1"
$Query= "SELECT ObjectID FROM [Azure_Data].[dbo].[Azure_User]"
$SQL_ObjectIDs=Invoke-Sqlcmd -ConnectionString "Data Source=Media-Center\SQLExpress;Initial Catalog=Azure_Data; Integrated Security=True;" -Query "$Query"
​
#Build Usable Array for SQL Data (System.Data.DataRow)
$SQL_Array=@()
Foreach($SQLItem in $SQL_ObjectIDs){
$SQL_Array+=$SQLItem.Item(0);
}
​
#------------------------------Gather All User Data in Azure AD------------------------------
$AppID = 'b7bbcf98-f84e-xxxxx-66427c667105'
$TenantID = '8d151ea2-4bxxxx09b-e5e020c04470'
$Thumbprint = 'D5EA77AD4C9xxxxxD35032AF04E022C71F8'
Connect-AzureAD -TenantId $tenantid -ApplicationId $appid -CertificateThumbprint $Thumbprint
$Userdata=Get-AzureADUser | Select *
#Compare Values to see allow only updating current accounts known to SQL
$ObjectID_LeftOver=Compare-Object -ReferenceObject $SQL_Array -DifferenceObject $Userdata.ObjectID -IncludeEqual | ? {$_.SideIndicator -eq '=='} | Select -ExpandProperty inputobject
#--------------------------------------------------------------------------------------------
​
#Loop Through Matching ObjectID and Update SQL only for these accounts
Foreach($Items in $ObjectID_LeftOver){
$MyValues=$Userdata | Where{$_.ObjectID -eq $Items}
#Variables
$DisplayName = $MyValues.DisplayName
$AccountEnabled = $MyValues.AccountEnabled
$JobTitle = $MyValues.JobTitle
$Mobile = $MyValues.Mobile
$TelephoneNumber = $MyValues.TelephoneNumber
$GivenName = $MyValues.GivenName
$Surname = $MyValues.Surname
#Update Query for Azure Users Table
$Update_Query="UPDATE [dbo].[Azure_User]
SET [DisplayName] = '$Displayname',
[AccountEnabled] = '$AccountEnabled',
[JobTitle] = '$JobTitle',
[Mobile] = '$Mobile',
[TelephoneNumber] = '$TelephoneNumber',
[Surname] = '$Surname',
[GivenName] = '$GivenName' WHERE [ObjectID] = '$Items'"
​
#Executes Command to Update Record
Invoke-Sqlcmd -ConnectionString "Data Source=Media-Center\SQLExpress;Initial Catalog=Azure_Data; Integrated Security=True;" -Query $Update_Query
}