ActiveDirectory Module Reloads mid-Dashboard progress, Why?
I’ve had this issue since I first started using PShell Universal. That was a while ago and I thought I’d eventually figure it out but I’m still at a loss.
Basically, I’ll load the dashboard and see the blue progress showing it is loading the module. I have a dashboard where the user uploads a file and submits it which calls up a modal that shows the progress. Overall, I have it working pretty well but every once in a while, the AD module just loads again. It interrupts the modal and takes them back to the main page. The script seems to finish. At least part of it does but I’d really like to guarantee that won’t happen. It is running simple AD User attribute updates from a CSV.
I can run 700 users updating upwards of 10 attributes a user,with no problem but, occasionally the random reload occurs. I have this set:
$ProgressPreference = “SilentlyContinue”
And it seems to have suppressed it some, but it does still happen.
I was just curious if someone could tell me what is triggering it. Is it a session timeout or is my code in by form and is what is causing this.
I appreciate any guidance. Thanks
This is due to the fact that PSU runs in multiple runspaces. It’s loading the AD module whenever it creates a new runspace. You could try to setup your environment to load the AD module automatically rather than during the creation of the runspace when running the dashboards.
You would do so on the environments page.
Adam Driscoll
PowerShell Expert and Developer at Devolutions
@Adam Driscoll I realy appreciate you answering my question. My guess is you get it a lot. And after more testing, I do think adding the $ProgressPreference = ‘SilentlyContinue’ to the beginning of the Dashboard\App code is working:
$ProgressPreference = 'SilentlyContinue'
$Navigation = @(
New-UDListItem -Label 'Active Directory Powershell Tools' -OnClick {
Invoke-UDRedirect -Url '/ADPowershellTools'
}
New-UDListItem -Label 'Import ADP CSV to AD' -OnClick {
Invoke-UDRedirect -Url '/ImportADPCSVtoAD'
}
)
New-UDApp -Title 'MS AD Dashboard (PowerShell Universal)' -Pages @(
Get-UDPage -Name 'Active Directory Powershell Tools'
Get-UDPage -Name 'Import ADP CSV to AD'
) -Navigation $Navigation
And here is the environments config.
New-PSUEnvironment -Name "PShell 7 Active Directory Dashboard Environment" -Version "7.3.9" -Path "C:\Program Files\PowerShell\7\pwsh.exe" -Modules @('ActiveDirectory', 'Russ.ADTools.Dashboard.ADP.Functions', 'Russ.Connection.MGGraph', 'Microsoft.Graph.Users', 'Russ.ADTools.Maintenance.ADP.Functions') -Variables @('*') -MaxRunspaces 3 -Description "Environment for the production dashboard AD Tool"
And I believe I have it setup so it should only instigate a new runspace when more than one user opens the app in a different browser. (Let me know if that isn’t the case.)
I did however make another run today and though the bulk of the script finished (script is wrapped in a UDDynamic btw), during the last foreach loop, it seems to have failed half-way through. Though it did run the final block that sends an email.
If I understand correctly and as long as the page is open and the mouse is occasionally moving, the default session timer keeps resetting to the default amount of time to countdown from. Even though I was doing this, whatever about my code seems to have caused another runspace to spin up and interrupt the script.
It is worth noting that this was during roughly the 3rd file I was processing and there is a finish button the user has to click after a file is processed and part of that button’s actions, besides nulling out variables, it starts the user at the beginning with a UDRedirect:
Invoke-UDRedirect -Url '/ImportADPCSVtoAD'
Again, I appreciate you responding in general but if you could tell me what, if anything, there is that can be done to gurantee my script won’t get inturruped, I’d really appreciate it.
It’s more lines than are allowed for a forum post but here is my code truncated:
Show-UDModal -Footer {
New-UDButton -Id 'UDBTNADPProcessAnother' -OnClick {
$session:ADPUserCSVData = $null
$page:ADPCSVUploadBodyRawData = $null
$page:ADPUploadFrmData = $null
$page:ADPUploadFrmFPathPlusFName = $null
$page:ADPUploadFrmFileName = $null
$page:ADPUploadPathValidation = $null
$page:ADPUploadFileValidation = $null
Invoke-UDRedirect -Url '/ImportADPCSVtoAD'
Hide-UDModal
} -Text 'DO NOT CLICK'
} -Content {
Add-Content -Path $session:LogfileExportPathandName -Value "INFO: ADP Import Process Started by User: $User" -Force
Add-Content -Path $session:LogfileExportPathandName -Value "INFO: The ADP CSV file submitted for import passed all validation tests. The users submitted will be updated." -Force
New-UDTypography -Text 'ADP Data is Now Importing' -Variant h3 -Style @{ color = 'green' }
#null out Pre-Import Variables
$page:CSVPreCompFileTimestamp = $null
$session:CSVPreComparisonPathandName = $null
#null out Post-Import Variables
$page:CSVPostCompFileTimestamp = $null
$session:CSVPostComparisonPathandName = $null
#set Pre-Import path and file name info
$page:CSVPreCompFileTimestamp = $cache:ADPImportFunctionVariablelTimestamp
$session:CSVPreComparisonPathandName = "$env:SystemDrive\Temp\PShellUniversal\ADPFiles\Pre-ADPtoADUserUpdateRecord\Pre-ProcessedADUserAttributeValues-$page:CSVPreCompFileTimestamp.csv"
#set Post-Import path and file name info
$page:CSVPostCompFileTimestamp = $cache:ADPImportFunctionVariablelTimestamp
$session:CSVPostComparisonPathandName = "$env:SystemDrive\Temp\PShellUniversal\ADPFiles\Post-ADPtoADUserUpdateRecord\Post-ProcessedADUserAttributeValues-$page:CSVPostCompFileTimestamp.csv"
$page:ADPNumberOfUsersSubmitted = 0
$page:ADPNumberOfUsersSubmitted = $page:ADPUserCSVDataMeasure
$page:ADPNumberOfCurrentUserBeingProcessed = 0
New-UDDynamic -Id 'UDDYADPImportProgressStatus' -Content {
$page:ADPImportProgressPercent = 0
$page:ADPImportProgressPercent = ($page:ADPNumberOfCurrentUserBeingProcessed / $page:ADPNumberOfUsersSubmitted) * 100
$page:ADPImportProgressPercent = [math]::Round($page:ADPImportProgressPercent)
$page:ADPImportProgressPercentCosmetic = $null
$page:ADPImportProgressPercentCosmetic = ($page:ADPNumberOfCurrentUserBeingProcessed / $page:ADPNumberOfUsersSubmitted).tostring("P")
New-UDTypography -Content { "The $page:ADPNumberOfUsersSubmitted users you submitted for update are now processing." } -Variant h4
New-UDProgress -PercentComplete $page:ADPImportProgressPercent
New-UDTypography -Content { "Percent Complete: $page:ADPImportProgressPercentCosmetic" } -Variant h4
}
New-UDDynamic -Id 'UDDYADPImportForEach' -Content {
foreach ($session:ADPUserCSV in $session:ADPUserCSVData) {
#reset all variables used to hold data from ADP CSV
TRUNCATED
#immediately populate those attributes with data from csv
TRUNCATED
#reset all variables used to hold data Users current AD Data
TRUNCATED
#immediately set those variables with the currently processing users AD attribute values
$session:ADUserActDirData = Get-ADUser -LDAPFilter “(employeeID=$session:ADPUserAssocID)” -Properties sAMAccountName, employeeID, userPrincipalName, title, department, physicalDeliveryOfficeName, telephoneNumber, mobile, facsimileTelephoneNumber, streetAddress, city, st, postalCode, manager, accountExpirationDate, extensionAttribute5, extensionAttribute6, extensionAttribute7, extensionAttribute8, extensionAttribute15 -Server kvc.org | Select-Object -Property sAMAccountName, userPrincipalName, employeeID, title, department, physicalDeliveryOfficeName, telephoneNumber, mobile, facsimileTelephoneNumber, streetAddress, city, st, postalCode, manager, accountExpirationDate, extensionAttribute5, extensionAttribute6, extensionAttribute7, extensionAttribute8, extensionAttribute15
$session:ADPADUserReportsToManagerDistName = $session:ADUserActDirData.manager
$session:ADUserEmployeeID = $session:ADUserActDirData.employeeID
$session:ADUserPrincipalName = $session:ADUserActDirData.userPrincipalName
$session:ADUserAccountExpirationDate = $session:ADUserActDirData.accountExpirationDate
$session:ADUserJobTitle = $session:ADUserActDirData.Title
$session:ADUserDepartmentDescript = $session:ADUserActDirData.Department
$session:ADUserPDON = $session:ADUserActDirData.physicalDeliveryOfficeName
$session:ADUserWorkOfficeNum = $session:ADUserActDirData.telephoneNumber
$session:ADUserWorkMobileNum = $session:ADUserActDirData.mobile
$session:ADUserWorkFacsimileNum = $session:ADUserActDirData.facsimileTelephoneNumber
$session:ADUserStreetAddress = $session:ADUserActDirData.StreetAddress
$session:ADUserCity = $session:ADUserActDirData.city
$session:ADUserState = $session:ADUserActDirData.st
$session:ADUserPostalCode = $session:ADUserActDirData.postalCode
$session:ADUserExtAttrib5 = $session:ADUserActDirData.extensionAttribute5
$session:ADUserExtAttrib6 = $session:ADUserActDirData.extensionAttribute6
$session:ADUserExtAttrib7 = $session:ADUserActDirData.extensionAttribute7
$session:ADUserExtAttrib8 = $session:ADUserActDirData.extensionAttribute8
$session:ADUserExtAttrib15 = $session:ADUserActDirData.extensionAttribute15
try {
$session:ADUserADManagerPulledFromAD = Get-ADUser -LDAPFilter “(employeeID=$session:ADPUserReportToManager)” -Properties sAMAccountName, userPrincipalName, DistinguishedName | Select-Object sAMAccountName, userPrincipalName, DistinguishedName
}
catch {
Add-Content -Path $session:LogfileExportPathandName -Value "PROCESSING: $session:ADUserPrincipalName has no manager set in the AD." -Force
}
#Clear variables used to hold the phone numbers from ADP then properly format them
#there attributes that hold the non formatted numbers are in the other functions
#Null variables for phone number fomatting
$session:ADPUserWorkOfficeNumFormatted = $null
$session:ADPUserWorkMobileNumFormatted = $null
$session:ADPUserWorkFacsimileNumFormatted = $null
$session:ADPUserWorkOfficeNumFormattedForSignature = $null
#working format command but a bit complicated
$session:ADPUserWorkOfficeNumFormatted = $session:ADPUserWorkOfficeNum -replace "[^0-9]", "" -replace "^1(\d{10})$", '$1' -replace "(\d{3})(\d{3})(\d{4})", '+1$1$2$3'
$session:ADPUserWorkMobileNumFormatted = $session:ADPUserWorkMobileNum -replace "[^0-9]", "" -replace "^1(\d{10})$", '$1' -replace "(\d{3})(\d{3})(\d{4})", '$1-$2-$3'
$session:ADPUserWorkFacsimileNumFormatted = $session:ADPUserWorkFacsimileNum -replace "[^0-9]", "" -replace "^1(\d{10})$", '$1' -replace "(\d{3})(\d{3})(\d{4})", '$1-$2-$3'
$session:ADPUserWorkOfficeNumFormattedForSignature = $session:ADPUserWorkOfficeNum -replace "[^0-9]", "" -replace "^1(\d{10})$", '$1' -replace "(\d{3})(\d{3})(\d{4})", '$1-$2-$3'
#write users AD values to a CSV before the change
try {
#Build a Pre Import User list with attrib values CSV doc for the compare
Get-ADUser -LDAPFilter “(employeeID=$session:ADPUserAssocID)” -Properties sAMAccountName, employeeID, userPrincipalName, displayName, title, department, physicalDeliveryOfficeName, telephoneNumber, mobile, facsimileTelephoneNumber, streetAddress, city, st, postalCode, manager, accountExpirationDate, extensionAttribute5, extensionAttribute6, extensionAttribute7, extensionAttribute8, extensionAttribute15 | Select-Object sAMAccountName, employeeID, userPrincipalName, displayName, title, department, physicalDeliveryOfficeName, telephoneNumber, mobile, facsimileTelephoneNumber, streetAddress, city, st, postalCode, manager, accountExpirationDate, extensionAttribute5, extensionAttribute6, extensionAttribute7, extensionAttribute8, extensionAttribute15 | Export-Csv -Path $session:CSVPreComparisonPathandName -NoTypeInformation -NoClobber -Append
}
catch {
Add-Content -Path $session:LogfileExportPathandName -Value "ERROR: There was a problem polling the following users Pre-Update Attributes: $session:ADUserPrincipalName The error will be logged. Please review the SYSTEMERROR on the next line." -Force
Add-Content -Path $session:LogfileExportPathandName -Value "SYSTEMERROR: $_" -Force
}
#commit all the data that is detected to need an update to AD unless they are empty
Add-Content -Path $session:LogfileExportPathandName -Value "PROCESSING: $session:ADUserPrincipalName ..." -Force
#Process Users Job Title
if ($session:ADPUserJobTitle -eq '') {
Add-Content -Path $session:LogfileExportPathandName -Value "BLANK: The Users Job Title in ADP is blank. No changes will be made to the user's Job Title attribute value." -Force
}
elseif ($session:ADPUserJobTitle -ne $session:ADUserActDirData.title) {
try {
Set-ADUser -Identity $session:ADUserActDirData.sAMAccountName -Title $session:ADPUserJobTitle -Server kvc.org
Add-Content -Path $session:LogfileExportPathandName -Value "UPDATING: Title $session:ADUserJobTitle will be overwritten with value $session:ADPUserJobTitle" -Force
}
catch {
Add-Content -Path $session:LogfileExportPathandName -Value "ERROR: There was a problem updating the following user: $session:ADUserPrincipalName The script was unable to update the users title attribute value with the following data: $session:ADPUserJobTitle Please review the SYSTEMERROR on the next line." -Force
Add-Content -Path $session:LogfileExportPathandName -Value "SYSTEMERROR: $_" -Force
}
}
else {
Add-Content -Path $session:LogfileExportPathandName -Value "NOCHANGE: The Users ADP Job Title information in ADP already matches the AD objects Title attribute value: ADP Value = $session:ADPUserJobTitle <==> AD Value = $session:ADUserJobTitle" -Force
}
TRUNCATED
TRUNCATED
TRUNCATED
}
#CODE THAT GETS INTURRUPTED
$page:CSVCompareResultFileTimestamp = $null
$page:CSVCompareResultsPath = $null
$page:CSVCompareResultsPathandNameSuccess = $null
#set Pre-Import path and file name info
$page:CSVCompareResultFileTimestamp = $cache:ADPImportFunctionVariablelTimestamp
$page:CSVCompareResultsPath = "$env:SystemDrive\Temp\PShellUniversal\ADPFiles\ADPADChangeComparisonResults"
$page:CSVCompareResultsPathandNameSuccess = "$page:CSVCompareResultsPath\ProcessedADUserAttributeValuesCompared-$page:CSVCompareResultFileTimestamp.csv"
#null out comparison variables
$CSVPreRefValCompPostDifVals = @()
$page:CSVCompareResultsPSOValues = $null
$CSVArrayOfCompareResults = @()
$page:CSVPreRecordIndexValue = 0
$page:CSVPostRecordIndexValue = 0
$page:ImportEmployeeTitleChange = $null
$page:ImportEmployeeDepartmentChange = $null
$page:ImportEmployeephysDelivOffNameChange = $null
$page:ImportEmployeeTelephoneNumChange = $null
$page:ImportEmployeeMobileNumChange = $null
$page:ImportEmployeeFaxNumChange = $null
$page:ImportEmployeeStreetAddrChange = $null
$page:ImportEmployeeCityChange = $null
$page:ImportEmployeeStateChange = $null
$page:ImportEmployeePostalCodeChange = $null
$page:ImportEmployeeManagerChange = $null
$page:ImportEmployeeAccountExpirationChange = $null
$page:ImportEmployeeextAttrib5Change = $null
$page:ImportEmployeeextAttrib6Change = $null
$page:ImportEmployeeextAttrib7Change = $null
$page:ImportEmployeeextAttrib8Change = $null
$page:ImportEmployeeextAttrib15Change = $null
#Pre and Post value comparison code
$CSVCompareResult = $null
$CSVPreComparisonFileImport = $null
$CSVPostComparisonFileImport = $null
$CSVPreComparisonFileImport = Import-Csv -Path $session:CSVPreComparisonPathandName
$CSVPostComparisonFileImport = Import-Csv -Path $session:CSVPostComparisonPathandName
$CSVPreRefValCompPostDifVals = Compare-Object -ReferenceObject @($CSVPreComparisonFileImport | Select-Object) -DifferenceObject @($CSVPostComparisonFileImport | Select-Object) -Property employeeID, userPrincipalName, title, department, physicalDeliveryOfficeName, telephoneNumber, mobile, facsimileTelephoneNumber, streetAddress, city, st, postalCode, manager, accountExpirationDate, extensionAttribute5, extensionAttribute6, extensionAttribute7, extensionAttribute8, extensionAttribute15 -CaseSensitive -PassThru | Where-Object { $_.SideIndicator -eq "=>" }
Foreach ($CSVCompareResult in $CSVPreRefValCompPostDifVals) {
$page:CSVPreRecordIndexValue = [Array]::IndexOf($CSVPreComparisonFileImport.employeeID, $CSVCompareResult.employeeID)
$page:CSVPostRecordIndexValue = [Array]::IndexOf($CSVPostComparisonFileImport.employeeID, $CSVCompareResult.employeeID)
$page:ImportEmployeeTitleChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].title) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].title)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].title } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].title + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].title }
$page:ImportEmployeeDepartmentChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].department) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].department)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].department } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].department + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].department }
$page:ImportEmployeephysDelivOffNameChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].physicalDeliveryOfficeName) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].physicalDeliveryOfficeName)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].physicalDeliveryOfficeName } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].physicalDeliveryOfficeName + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].physicalDeliveryOfficeName }
$page:ImportEmployeeTelephoneNumChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].telephoneNumber) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].telephoneNumber)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].telephoneNumber } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].telephoneNumber + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].telephoneNumber }
$page:ImportEmployeeMobileNumChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].mobile) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].mobile)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].mobile } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].mobile + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].mobile }
$page:ImportEmployeeFaxNumChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].facsimileTelephoneNumber) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].facsimileTelephoneNumber)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].facsimileTelephoneNumber } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].facsimileTelephoneNumber + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].facsimileTelephoneNumber }
$page:ImportEmployeeStreetAddrChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].streetAddress) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].streetAddress)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].streetAddress } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].streetAddress + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].streetAddress }
$page:ImportEmployeeCityChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].city) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].city)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].city } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].city + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].city }
$page:ImportEmployeeStateChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].st) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].st)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].st } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].st + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].st }
$page:ImportEmployeePostalCodeChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].postalCode) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].postalCode)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].postalCode } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].postalCode + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].postalCode }
$page:ImportEmployeeManagerChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].manager) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].manager)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].manager } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].manager + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].manager }
$page:ImportEmployeeAccountExpirationChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].accountExpirationDate) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].accountExpirationDate)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].accountExpirationDate } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].accountExpirationDate + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].accountExpirationDate }
$page:ImportEmployeeextAttrib5Change = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute5) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute5)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute5 } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute5 + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute5 }
$page:ImportEmployeeextAttrib6Change = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute6) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute6)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute6 } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute6 + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute6 }
$page:ImportEmployeeextAttrib7Change = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute7) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute7)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute7 } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute7 + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute7 }
$page:ImportEmployeeextAttrib8Change = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute8) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute8)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute8 } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute8 + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute8 }
$page:ImportEmployeeextAttrib15Change = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute15) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute15)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute15 } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute15 + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute15 }
$page:CSVCompareResultsPSOValues = [pscustomobject][ordered] @{
employeeID = $CSVCompareResult.employeeID
userPrincipalName = $CSVCompareResult.userPrincipalName
title = $page:ImportEmployeeTitleChange
department = $page:ImportEmployeeDepartmentChange
physicalDeliveryOfficeName = $page:ImportEmployeephysDelivOffNameChange
telephonenumber = $page:ImportEmployeeTelephoneNumChange
mobile = $page:ImportEmployeeMobileNumChange
facsimileTelephoneNumber = $page:ImportEmployeeFaxNumChange
streetAddress = $page:ImportEmployeeStreetAddrChange
city = $page:ImportEmployeeCityChange
st = $page:ImportEmployeeStateChange
postalCode = $page:ImportEmployeePostalCodeChange
manager = $page:ImportEmployeeManagerChange
accountExpirationDate = $page:ImportEmployeeAccountExpirationChange
extensionAttribute5 = $page:ImportEmployeeextAttrib5Change
extensionAttribute6 = $page:ImportEmployeeextAttrib6Change
extensionAttribute7 = $page:ImportEmployeeextAttrib7Change
extensionAttribute8 = $page:ImportEmployeeextAttrib8Change
extensionAttribute15 = $page:ImportEmployeeextAttrib15Change
}
$CSVArrayOfCompareResults += $page:CSVCompareResultsPSOValues
}
Add-Content -Path $session:LogfileExportPathandName -Value "INFO: The attribute values for the uploaded list of users has been processed." -Force
if (($CSVArrayOfCompareResults | Sort-Object userPrincipalName | Select-Object * -Unique).count -gt 0) {
$CSVArrayOfCompareResults | Select-Object employeeID, userPrincipalName, title, department, physicalDeliveryOfficeName, telephoneNumber, mobile, facsimileTelephoneNumber, streetAddress, city, st, postalCode, manager, accountExpirationDate, extensionAttribute5, extensionAttribute6, extensionAttribute7, extensionAttribute8, extensionAttribute15 | Export-Csv -Path $page:CSVCompareResultsPathandNameSuccess -Append -NoClobber -NoTypeInformation
Add-Content -Path $session:LogfileExportPathandName -Value "INFO: The attribute values of the submitted users where logged before being updated in file: $session:CSVPreComparisonPathandName" -Force
Add-Content -Path $session:LogfileExportPathandName -Value "INFO: The attribute values of the submitted users where logged after being updated in file: $session:CSVPostComparisonPathandName" -Force
Add-Content -Path $session:LogfileExportPathandName -Value "INFO: The results from comparing the attribute values before and after import are available in file: $page:CSVCompareResultsPathandNameSuccess" -Force
}
else {
Add-Content -Path $session:LogfileExportPathandName -Value "INFO: After comparing the submitted users attribute values, NO changes were detected. A place holder file was created and is located in the log folder: $page:CSVCompareResultsPath" -Force
Add-Content -Path $page:CSVCompareResultsPathandNameSuccess -Value "This file was created as a placeholder. No differences where detected." -Force
}
TRUNCATED
}
New-UDButton -Id 'UDBTNImportFinished' -OnClick {
$session:ADPUserCSVData = $null
$page:ADPCSVUploadBodyRawData = $null
$page:ADPUploadFrmData = $null
$page:ADPUploadFrmFPathPlusFName = $null
$page:ADPUploadFrmFileName = $null
$page:ADPUploadPathValidation = $null
$page:ADPUploadFileValidation = $null
Invoke-UDRedirect -Url '/ImportADPCSVtoAD'
Hide-UDModal
} -Text 'FINISH' -Disabled:$True
} -FullScreen -Persistent
}I probably truncated to much but this is the code that can get interrupted:
#CODE THAT GETS INTURRUPTED
$page:CSVCompareResultFileTimestamp = $null
$page:CSVCompareResultsPath = $null
$page:CSVCompareResultsPathandNameSuccess = $null
#set Pre-Import path and file name info
$page:CSVCompareResultFileTimestamp = $cache:ADPImportFunctionVariablelTimestamp
$page:CSVCompareResultsPath = "$env:SystemDrive\Temp\PShellUniversal\ADPFiles\ADPADChangeComparisonResults"
$page:CSVCompareResultsPathandNameSuccess = "$page:CSVCompareResultsPath\ProcessedADUserAttributeValuesCompared-$page:CSVCompareResultFileTimestamp.csv"
#null out comparison variables
$CSVPreRefValCompPostDifVals = @()
$page:CSVCompareResultsPSOValues = $null
$CSVArrayOfCompareResults = @()
$page:CSVPreRecordIndexValue = 0
$page:CSVPostRecordIndexValue = 0
$page:ImportEmployeeTitleChange = $null
$page:ImportEmployeeDepartmentChange = $null
$page:ImportEmployeephysDelivOffNameChange = $null
$page:ImportEmployeeTelephoneNumChange = $null
$page:ImportEmployeeMobileNumChange = $null
$page:ImportEmployeeFaxNumChange = $null
$page:ImportEmployeeStreetAddrChange = $null
$page:ImportEmployeeCityChange = $null
$page:ImportEmployeeStateChange = $null
$page:ImportEmployeePostalCodeChange = $null
$page:ImportEmployeeManagerChange = $null
$page:ImportEmployeeAccountExpirationChange = $null
$page:ImportEmployeeextAttrib5Change = $null
$page:ImportEmployeeextAttrib6Change = $null
$page:ImportEmployeeextAttrib7Change = $null
$page:ImportEmployeeextAttrib8Change = $null
$page:ImportEmployeeextAttrib15Change = $null
#Pre and Post value comparison code
$CSVCompareResult = $null
$CSVPreComparisonFileImport = $null
$CSVPostComparisonFileImport = $null
$CSVPreComparisonFileImport = Import-Csv -Path $session:CSVPreComparisonPathandName
$CSVPostComparisonFileImport = Import-Csv -Path $session:CSVPostComparisonPathandName
$CSVPreRefValCompPostDifVals = Compare-Object -ReferenceObject @($CSVPreComparisonFileImport | Select-Object) -DifferenceObject @($CSVPostComparisonFileImport | Select-Object) -Property employeeID, userPrincipalName, title, department, physicalDeliveryOfficeName, telephoneNumber, mobile, facsimileTelephoneNumber, streetAddress, city, st, postalCode, manager, accountExpirationDate, extensionAttribute5, extensionAttribute6, extensionAttribute7, extensionAttribute8, extensionAttribute15 -CaseSensitive -PassThru | Where-Object { $_.SideIndicator -eq "=>" }
Foreach ($CSVCompareResult in $CSVPreRefValCompPostDifVals) {
$page:CSVPreRecordIndexValue = [Array]::IndexOf($CSVPreComparisonFileImport.employeeID, $CSVCompareResult.employeeID)
$page:CSVPostRecordIndexValue = [Array]::IndexOf($CSVPostComparisonFileImport.employeeID, $CSVCompareResult.employeeID)
$page:ImportEmployeeTitleChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].title) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].title)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].title } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].title + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].title }
$page:ImportEmployeeDepartmentChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].department) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].department)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].department } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].department + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].department }
$page:ImportEmployeephysDelivOffNameChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].physicalDeliveryOfficeName) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].physicalDeliveryOfficeName)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].physicalDeliveryOfficeName } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].physicalDeliveryOfficeName + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].physicalDeliveryOfficeName }
$page:ImportEmployeeTelephoneNumChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].telephoneNumber) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].telephoneNumber)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].telephoneNumber } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].telephoneNumber + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].telephoneNumber }
$page:ImportEmployeeMobileNumChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].mobile) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].mobile)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].mobile } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].mobile + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].mobile }
$page:ImportEmployeeFaxNumChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].facsimileTelephoneNumber) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].facsimileTelephoneNumber)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].facsimileTelephoneNumber } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].facsimileTelephoneNumber + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].facsimileTelephoneNumber }
$page:ImportEmployeeStreetAddrChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].streetAddress) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].streetAddress)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].streetAddress } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].streetAddress + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].streetAddress }
$page:ImportEmployeeCityChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].city) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].city)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].city } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].city + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].city }
$page:ImportEmployeeStateChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].st) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].st)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].st } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].st + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].st }
$page:ImportEmployeePostalCodeChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].postalCode) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].postalCode)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].postalCode } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].postalCode + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].postalCode }
$page:ImportEmployeeManagerChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].manager) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].manager)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].manager } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].manager + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].manager }
$page:ImportEmployeeAccountExpirationChange = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].accountExpirationDate) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].accountExpirationDate)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].accountExpirationDate } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].accountExpirationDate + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].accountExpirationDate }
$page:ImportEmployeeextAttrib5Change = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute5) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute5)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute5 } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute5 + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute5 }
$page:ImportEmployeeextAttrib6Change = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute6) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute6)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute6 } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute6 + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute6 }
$page:ImportEmployeeextAttrib7Change = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute7) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute7)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute7 } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute7 + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute7 }
$page:ImportEmployeeextAttrib8Change = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute8) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute8)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute8 } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute8 + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute8 }
$page:ImportEmployeeextAttrib15Change = if (($CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute15) -eq ($CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute15)) { "Value Did Not Change: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute15 } else { "Previous Value: " + $CSVPreComparisonFileImport[$page:CSVPreRecordIndexValue].extensionAttribute15 + " | Updated Value: " + $CSVPostComparisonFileImport[$page:CSVPostRecordIndexValue].extensionAttribute15 }
$page:CSVCompareResultsPSOValues = [pscustomobject][ordered] @{
employeeID = $CSVCompareResult.employeeID
userPrincipalName = $CSVCompareResult.userPrincipalName
title = $page:ImportEmployeeTitleChange
department = $page:ImportEmployeeDepartmentChange
physicalDeliveryOfficeName = $page:ImportEmployeephysDelivOffNameChange
telephonenumber = $page:ImportEmployeeTelephoneNumChange
mobile = $page:ImportEmployeeMobileNumChange
facsimileTelephoneNumber = $page:ImportEmployeeFaxNumChange
streetAddress = $page:ImportEmployeeStreetAddrChange
city = $page:ImportEmployeeCityChange
st = $page:ImportEmployeeStateChange
postalCode = $page:ImportEmployeePostalCodeChange
manager = $page:ImportEmployeeManagerChange
accountExpirationDate = $page:ImportEmployeeAccountExpirationChange
extensionAttribute5 = $page:ImportEmployeeextAttrib5Change
extensionAttribute6 = $page:ImportEmployeeextAttrib6Change
extensionAttribute7 = $page:ImportEmployeeextAttrib7Change
extensionAttribute8 = $page:ImportEmployeeextAttrib8Change
extensionAttribute15 = $page:ImportEmployeeextAttrib15Change
}
$CSVArrayOfCompareResults += $page:CSVCompareResultsPSOValues
}
Add-Content -Path $session:LogfileExportPathandName -Value "INFO: The attribute values for the uploaded list of users has been processed." -Force
if (($CSVArrayOfCompareResults | Sort-Object userPrincipalName | Select-Object * -Unique).count -gt 0) {
$CSVArrayOfCompareResults | Select-Object employeeID, userPrincipalName, title, department, physicalDeliveryOfficeName, telephoneNumber, mobile, facsimileTelephoneNumber, streetAddress, city, st, postalCode, manager, accountExpirationDate, extensionAttribute5, extensionAttribute6, extensionAttribute7, extensionAttribute8, extensionAttribute15 | Export-Csv -Path $page:CSVCompareResultsPathandNameSuccess -Append -NoClobber -NoTypeInformation
Add-Content -Path $session:LogfileExportPathandName -Value "INFO: The attribute values of the submitted users where logged before being updated in file: $session:CSVPreComparisonPathandName" -Force
Add-Content -Path $session:LogfileExportPathandName -Value "INFO: The attribute values of the submitted users where logged after being updated in file: $session:CSVPostComparisonPathandName" -Force
Add-Content -Path $session:LogfileExportPathandName -Value "INFO: The results from comparing the attribute values before and after import are available in file: $page:CSVCompareResultsPathandNameSuccess" -Force
}
else {
Add-Content -Path $session:LogfileExportPathandName -Value "INFO: After comparing the submitted users attribute values, NO changes were detected. A place holder file was created and is located in the log folder: $page:CSVCompareResultsPath" -Force
Add-Content -Path $page:CSVCompareResultsPathandNameSuccess -Value "This file was created as a placeholder. No differences where detected." -Force
}
I didn’t think setting max runspaces to 1 would be the way to solve this. As you can probably tell, I’m just not sure. If it’s possible to make sure code finishes before a runspace load or reload takes place, I’d really appreciate it.
I think I may know what caused my issue this time. And I’ll start by apologizing for wasting your time, though I did learn from you. I have a scheduled script that keeps the folders used by the script clean. I had it set to every 4 hours. I’ll bet that running caused the new runspace. I’m not certain but I figured I need to rule that out before asking more of you.
Thank you for your help.