Graph is a pain to work with if you are like me and just a scripter
Takes a list of employee IDs via the $employeeIDs variable
Queries Azure AD via Microsoft Graph in batches of 20
Retrieves userPrincipalName, employeeId, accountEnabled,
and LastPasswordChangeDateTime
Outputs results to console and CSV
Connect-MgGraph -Scopes "User.Read.All"
$employeeIds = @"
EMPID
0000001
"@ | ConvertFrom-Csv
$employeeIds = $employeeIds.empid
# Create batch request body
$batchRequests = @()
$batchSize = 20 # Microsoft Graph allows up to 20 requests per batch
$idCounter = 1
for ($i = 0; $i -lt $employeeIds.Count; $i++) {
$request = @{
"id" = "$idCounter"
"method" = "GET"
"url" = "/users?`$filter=employeeId eq '$($employeeIds[$i])'&`$select=userPrincipalName,employeeId,accountEnabled,LastPasswordChangeDateTime"
}
$batchRequests += $request
$idCounter++
}
# Split into batches of 20 which i believe is the limit
$batchedResults = @()
for ($i = 0; $i -lt $batchRequests.Count; $i += $batchSize) {
$batchEnd = [Math]::Min($i + $batchSize, $batchRequests.Count)
$currentBatch = $batchRequests[$i..($batchEnd-1)]
$batchBody = @{
"requests" = $currentBatch
} | ConvertTo-Json -Depth 10
# Send batch request
$response = Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/v1.0/`$batch" -Body $batchBody
# Process responses
foreach ($resp in $response.responses) {
if ($resp.status -eq 200 -and $resp.body.value) {
$batchedResults += $resp.body.value | Select-Object @{
Name = "UserPrincipalName"; Expression = {$_.userPrincipalName}
}, @{
Name = "EmployeeID"; Expression = {$_.employeeId}
}, @{
Name = "AccountEnabled"; Expression = {$_.accountEnabled}
}, @{
Name = "LastPasswordChangeDateTime"; Expression = {$_.LastPasswordChangeDateTime}
}
}
}
}
#Tesults
$batchedResults | Format-Table -AutoSize
$batchedResults | Export-Csv -Path "C:\AzureAD_Employee_Search.csv" -NoTypeInformation
Purpose: This script will read serial numbers from a text file then search dells site for warranty information. The get-dellassetinfo function i found from some forum but don't remember where.
Purpose: needed a hacked up batch file that was able to read time from a remote server and
log to a CSV for user logon auditing. They may have been a better way to do this in batch, but after about 5 hours of looking i decided to just write my own. Wish i could have used powershell.
Note:I found that using the net time //x.x.x.x command against a server can return different formatted results I think this script is able to handle the differences but i can not be certain without further testing
@echo off
REM Tony Unger
REM
REM login audit script
REM For Log In
Rem Writes to a CSV file
REM Thanks to http://brisray.com/comp/batch3.htm for length checking in batch
setlocal EnableDelayedExpansion
for /f "delims=" %%i in ('net time \\servername') do (
if "!CurrentTime!"=="" (set CurrentTime=%%i) else (set CurrentTime=!CurrentTime!#%%i)
)
echo %CurrentTime%
Echo parse the Net Time command
FOR /f "tokens=6,7,8" %%a IN ("%CurrentTime%") DO (
SET _date=%%a
SET _time=%%b
SET _AMPM=%%c
Echo after read ampm is %_AMPM%
If %_AMPM% ==AM#Local (
FOR /f "tokens=14,15,16" %%a IN ("%CurrentTime%") DO (
SET _date=%%a
SET _time=%%b
SET _AMPM=%%c
)
)
If %_AMPM% ==PM#Local (
FOR /f "tokens=14,15,16" %%a IN ("%CurrentTime%") DO (
SET _date=%%a
SET _time=%%b
SET _AMPM=%%c
)
)
Echo Now it is equal to: %_AMPM%
if %_HourUpdate% == 01 (set _HourUpdate=13)
Echo Break up the date to Day Month Year
for /f "tokens=1,2,3 delims=/ " %%A in ("%_date%") DO (
SET _Month=%%A
SET _Day=%%B
SET _Year=%%C
)
Echo Breakup Time to Hour Min Sec
for /f "tokens=1,2,3 delims=: " %%A in ("%_time%") DO (
SET _Hour=%%A
SET _Min=%%B
SET _Sec=%%C
)
Echo Removing spaces
set _Year=%_Year: =%
set _MonthUpdate=%_MonthUpdate: =%
set _Day=%_Day: =%
set _Hour=%_Hour: =%
set _Min=%_Min: =%
set _Sec=%_Sec: =%
REM
Echo Convert Month to two digits
set c=%_Month%
:Monthloop
if defined c (set c=%c:~1%&set /A _MonthCount += 1&goto Monthloop)
Echo Found %_MonthCount% in Month string
if "%_MonthCount%" LSS "2" (set _MonthUpdate=0%_Month%)
IF "%_MonthCount%" GTR "1" (set _MonthUpdate=%_Month%)
Echo %_MonthUpdate%
REM
Echo Convert Day to Two Digits
echo %_Day%
set c=%_Day%
:Dayloop
if defined c (set c=%c:~1%&set /A _DayCount += 1&goto Dayloop)
Echo Found %_DayCount% in day string
if "%_DayCount%" LSS "2" (set _DayUpdate=0%_Day%)
IF "%_DayCount%" GTR "1" (set _DayUpdate=%_Day%)
Echo %_DayUpdate%
REM
Echo Convert Hour to two digits
set c=%_Hour%
:Hourloop
if defined c (set c=%c:~1%&set /A b += 1&goto Hourloop)
Echo Found %b% in hour string
if "%b%" LSS "2" (set _HourUpdate=0%_Hour%)
IF "%b%" GTR "1" (set _HourUpdate=%_Hour%)
REM
Echo %_HourUpdate%
Echo Convert Hour to 24Hour
if %_AMPM%==PM#Local (
if %_HourUpdate% == 01 (set _HourUpdate=13)
if %_HourUpdate% == 02 (set _HourUpdate=14)
if %_HourUpdate% == 03 (set _HourUpdate=15)
if %_HourUpdate% == 04 (set _HourUpdate=16)
if %_HourUpdate% == 05 (set _HourUpdate=17)
if %_HourUpdate% == 07 (set _HourUpdate=19)
if %_HourUpdate% == 08 (set _HourUpdate=20)
if %_HourUpdate% == 09 (set _HourUpdate=21)
if %_HourUpdate% == 10 (set _HourUpdate=22)
if %_HourUpdate% == 11 (set _HourUpdate=23)
) ELSE (
if %_HourUpdate% == 12 (set _HourUpdate=00)
)
if %_AMPM%==PM#The (
if %_HourUpdate% == 01 (set _HourUpdate=13)
if %_HourUpdate% == 02 (set _HourUpdate=14)
if %_HourUpdate% == 03 (set _HourUpdate=15)
if %_HourUpdate% == 04 (set _HourUpdate=16)
if %_HourUpdate% == 05 (set _HourUpdate=17)
if %_HourUpdate% == 07 (set _HourUpdate=19)
if %_HourUpdate% == 08 (set _HourUpdate=20)
if %_HourUpdate% == 09 (set _HourUpdate=21)
if %_HourUpdate% == 10 (set _HourUpdate=22)
if %_HourUpdate% == 11 (set _HourUpdate=23)
) ELSE (
if %_HourUpdate% == 12 (set _HourUpdate=00)
)
REM
Echo Convert Mins to two digits
set c=%_Min%
:Minloop
if defined c (set c=%c:~1%&set /A _MinCount += 1&goto Minloop)
Echo Found %_MinCount% in minute string
if "%_MinCount%" LSS "2" (set _MinUpdate=0%_Min%)
IF "%_MinCount%" GTR "1" (set _MinUpdate=%_Min%)
Echo %_MinUpdate%
REM This is done incase seconds doesn't return as in older versions of windowss
if "%_Sec%"==" " SET _Sec=00
REM Remove Spaces from Strings
set _Year=%_Year: =%
set _MonthUpdate=%_MonthUpdate: =%
set _DayUpdate=%_DayUpdate: =%
set _HourUpdate=%_HourUpdate: =%
set _MinUpdate=%_MinUpdate: =%
set _Sec=%_Sec: =%
if not %_MonthUpdate%==is echo Log Off,%_Year%-%_MonthUpdate%-%_DayUpdate% %_HourUpdate%:%_MinUpdate%:%_Sec%,%COMPUTERNAME%,%USERNAME% >> \\servername\audit\%USERNAME%.csv
if %_MonthUpdate%==is echo %date:~10,4%-%date:~4,2%-%date:~7,2%,%COMPUTERNAME%,%USERNAME% >> \\servername\audit\errors.txt
Purpose:
This batch example will search for files with the extension .txt and deletes file less then 5 days old.
Required:
----------------------------------------------------
Forfiles.exe
/p The path to search
/s Recurse into sub-folders
/M Mask
/C command The command to execute for each file
/D - dd Select files with a last modified date less than or
equal to the current date minus "dd" days. (in the past)
-----------------------------------------------------
Del.exe
-----------------------------------------------------
Code:
Echo on
Forfiles /P c:\temp\ /S /M *.txt /C "cmd /c del @path" /D -5
If you have a space in the path the only way i found forfiles.exe to work is the following example
if a file is older then 30 days in e:\example space then delete
forfiles -p "e:\example space" -m *.* -s -d -30 -c "cmd /C del @FILE"