Fetching all Windows Server details from Active Directory
<# Created By Abhishek Bansal
Read Note
Script Usage - Fetching all Windows Server details in the domain from Active Directory. Useful in doing inventory management.
Pre requisites :: Copy all the code into a text file, save it with an extension ".PS1". Once saved, run this script as Administrator
Execution & Outputs :: Once executed, there will be two Output files created as -
ADCompdetails.csv - Containing details of all the Windows server found in Active Directory.
Errorlogs.csv - Logs any error while fetching the uptime.#>
$inputsrv = $(Get-ADComputer -Filter * -Properties OperatingSystem | ?{$_.OperatingSystem -match "Server"}).Name
foreach($server in $inputsrv)
{
$error.Clear()
try{
Get-ADComputer -Identity $server -Properties * | Select Name,OperatingSystem,DistinguishedName,IPv4Address,Enabled,Created | Export-Csv ./ADCompdetails.csv -NoTypeInformation -Append
}
catch
{
$server | Select-Object -Property @{n="Hostname";e={$server}},@{n="ErrorMessage";e={$error.exception.Message}} | Export-Csv ./Errorlogs.csv -NoTypeInformation -Append
}
}
Fetching Uptime of Remote Windows Servers
<# Created By Abhishek Bansal
Read Note
Script Usage - Useful in fetching uptime of Servers mentioned in a txt file.
Pre requisites :: Copy all the code into a text file, save it with an extension ".PS1". On same location create a txt file named "Servers.txt" containing name of servers. Once saved, run this script as Administrator.
Execution & Outputs :: Once executed, there will be two Output files created as -
Uptime.csv - Containing uptime of Servers
Errorlogs.csv - Logs any error while fetching the uptime.#>
function fetchuptime($server)
{
try{
$Error.Clear()
$details = Invoke-Command -ComputerName $server -ErrorAction Stop -ScriptBlock{Get-CimInstance -ClassName Win32_OperatingSystem}
return $($details.LocalDateTime - $details.LastBootUpTime)
}
catch
{
Write-Host -ForegroundColor Red "Logging error while fetching uptime of $server."
$server | Select-Object -Property @{n="Hostname";e={$server}},@{n="ErrorMessage";e={$Error.exception.Message}} | Export-Csv ./Errorlogs.csv -NoTypeInformation -Append
return "Error"
}
}
$Servers = Get-Content .\Servers.txt
Write-Host "Total Servers count = $($servers.count)"
#Pause for confirmation..
foreach($server in $Servers)
{
$server = $server.trim()
try{
$Error.Clear()
Write-Host -ForegroundColor Yellow "`nChecking if $server exist in the domain or not ..."
$compdetails = Get-ADComputer -Identity $server -Properties OperatingSystem
Write-Host -ForegroundColor Green "$server exist in domain having $($compdetails.OperatingSystem) OS."
$uptime = fetchuptime -server $server
if($uptime -eq "Error")
{
continue
}
else
{
$server | Select-Object -Property @{n="Hostname";e={$server}},@{n="Uptime";e={$(echo "Uptime is $($uptime.Days)Days $($uptime.Hours)Hrs $($uptime.Minutes)mins")}} | Export-Csv ./Uptime.csv -NoTypeInformation -Append
}
}
catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]
{
Write-Host -ForegroundColor Red "Logging error while fetching status of $server."
$server | Select-Object -Property @{n="Hostname";e={$server}},@{n="ErrorMessage";e={$Error.exception.Message}} | Export-Csv ./Errorlogs.csv -NoTypeInformation -Append
}
}
Fetching NTFS Permissions, Inheritance Status & Ownership details of Root folders along with 1 Level Sub folders
<# Created By Abhishek Bansal
Read Note
Script Usage - Useful in fetching Owners details, Inheritance status, NTFS Permissons of Parent / Root folder & one Level Sub folders.
Pre requisites :: Copy all the code into a text file, save it with an extension ".PS1". On same location create a txt file named "InputPath.txt" containing UNC path of share folders. Once saved, run this script as Administrator.
Execution & Outputs :: Once executed, there will be four Outifle files created which would be -
ParentfolderInheritance.csv - Containing parent folder Ownnership details along with inheritance status.
ParentfolderACL.csv - Containing parent folder NTFS permissions.
SubfoldersInheritance.csv - Containing one level subfoldes Ownnership details along with inheritance status.
SubfoldersACL.csv - Containing NTFS permissions for 1 level sub folders inside the parent folders.
Along with above, Errorlogs.csv can also be produced if there are any errors encountered while executing this script.#>
$rootfolders = Get-Content .\InputPath.txt
foreach($rootpath in $rootfolders)
{
$rootpath = $rootpath.trim()
Get-Acl -Path $rootpath | Select Path,Owner,@{n="Inheritance Status";e={$_.AreAccessRulesProtected}} | Export-Csv ./ParentfolderInheritance.csv -NoTypeInformation -Append
(Get-Acl -Path $rootpath).Access | Select @{n="Path";e={$rootpath}},IdentityReference,FileSystemRights,AccessControlType |Export-Csv ./ParentfoldersACL.csv -NoTypeInformation -Append
$subfolders = Get-ChildItem -Path $rootpath
foreach ($path in $subfolders)
{
try{
Get-Acl -Path $path.FullName | Select Path,Owner,@{n="Inheritance Status";e={$_.AreAccessRulesProtected}} | Export-Csv ./SubfoldersInheritance.csv -NoTypeInformation -Append
}
catch{
$rootpath | Select @{n="Rootfolder";e={$rootpath}},@{n="Errorinfo";e={"$path not accessible under $rootpath"}} | Export-Csv ./Errorlogs.csv -NoTypeInformation -Append
}
(Get-Acl -Path $path.FullName).Access | Select @{n="Path";e={$path.FullName}},IdentityReference,FileSystemRights,AccessControlType | Export-Csv ./SubfoldersACL.csv -NoTypeInformation -Append
}
}
Powershell Script - Finding out time Source of all the DC's in the domain
<#Created By Abhishek Bansal
Read Note
Script Usage :: Useful in fetching sync time source for all the domain controllers of the domain.
Pre requisites :: Copy all the code into a text file, save it with an extension ".PS1". Once saved, run it as Administrator.
Execution & Outputs :: Once executed, there will be two files created as Timesyncdetails.csv containing output and Errorlogs.csv for any errors. #>
$dcs = (Get-ADDomainController -Filter *).Name
Write-Host -ForegroundColor Green "$((Get-ADDomain).PDCEmulator) is holding PDC role.."
$line = 0
$linecount = $dcs.Count
$pct = 0
foreach($dc in $dcs)
{
$line++
$dc = $dc.Trim()
$pct = $line/$linecount * 100
try{
$error.Clear()
Write-Progress -Activity " " -PercentComplete $pct
Invoke-Command -ComputerName $dc -ScriptBlock{"`nFetching Sync time for $($using:dc)"} -ErrorAction Stop
$dc | Select-Object -Property @{n="Hostname";e={$dc}},@{n="Source";e={Invoke-Command -ComputerName $dc -ScriptBlock{w32tm /query /source}}} | Export-Csv ./Timesyncdetails.csv -NoTypeInformation -Append
}
catch{
$dc | Select-Object -Property @{n="Hostname";e={$dc}},@{n="ErrorInfo";e={$($error.exception.Message)}} | Export-Csv ./Errorlogs.csv -NoTypeInformation -Append
}
}
Comparing Windows Services Status Prior and Post Reboot
<#Created By Abhishek Bansal
Read Note
Script Usage :: Validation Script, Useful in Comparing Windows Services Status before & after reboot.
Pre requisites :: Copy all the code into a text file, save it with an extension ".PS1". Once saved, run it as Administrator. You need to run this script twice, first prior reboot with Option 1 and second time will be after rebooting with option 2.
Execution & Outputs :: Once executed, there will be two files created as BeforeRestart.csv containing Services status before reboot & one with name AfterRestart.csv containing Services status post reboot. Differences among both the files will be visible directly on the console in Red color. #>
Write-Host -ForegroundColor Yellow "`nPress 1 to fetch services status before reboot"
Write-Host -ForegroundColor Yellow "Press 2 to fetch services status after reboot & proceed with validations.."
$choice = Read-Host "`nEnter your choice = "
if($choice -eq 1)
{
Get-Service | Select Name,DisplayName,Status | Export-Csv ./BeforeRestart.csv -NoTypeInformation
}
elseif($choice -eq 2)
{
Get-Service | Select Name,DisplayName,Status | Export-Csv ./AfterRestart.csv -NoTypeInformation
$Beforerestartdata = Import-Csv .\BeforeRestart.csv
$Afterrestartdata = Import-Csv .\AfterRestart.csv
#Comparing Services.....
foreach($row in $Beforerestartdata)
{
foreach($row1 in $Afterrestartdata)
{
if($($row.Name) -eq $($row1.Name))
{
if($($row.Status) -eq $($row1.Status))
{
Write-Host "$($row.Name) seems fine" -ForegroundColor Green
}
else
{
Write-Host "$($row.DisplayName) service is having differences. Before Reboot Status was $($row.Status) and after reboot status is $($row1.Status)" -ForegroundColor Red
}
}
else
{
continue
}
}
}
}
else
{
Write-Host "Invalid Choice..."
}
Powershell Script - Comparing Policies sub folders with GP
<#Created By - Abhishek Bansal
Read Me !!
Script Usage - This script will compare sub folder of Policies folder inside Sysvol for every DC with the Group Policy configured in GPMC
Once it compares, it will list all the Policy folders which are mapped to GPMC and show as "Valid GPO Folder" and Policy folder for any non existing Group Policy would be shows as "Not valid GPO folder .#>
$gpoid = Get-GPO -All
$dcs = (Get-ADDomainController -Filter *).Name
foreach($dc in $dcs)
{
if($(Test-Path -Path "\\$dc\sysvol\Mari.com\Policies")-eq $true)
{
$Sysvolgpos = $(Get-ChildItem -Path "\\$dc\sysvol\Mari.com\Policies" -Exclude "*PolicyDefin*").Name
$arr = @()
foreach($Sysvolgpo in $Sysvolgpos)
{
foreach($gpo in $gpoid)
{
$gpoingpmc = "{$($gpo.id)}"
if($($gpoingpmc -eq $Sysvolgpo))
{
$arr += $gpoingpmc
break
}
}
}
}
$Sysvolgpos | Where {$arr -Contains $_} | Select-Object -Property @{n="Domain Controller";e={$dc}},@{n="GPO Folder";e={$_}},@{n="Status";e={"Valid GPO folder"}}
$Sysvolgpos | Where {$arr -NotContains $_} | Select-Object -Property @{n="Domain Controller";e={$dc}},@{n="GPO Folder";e={$_}},@{n="Status";e={"Not valid GPO folder"}}
}
Sample Output
Fetching Event Logging Mode on Windows Servers
<#Created By Abhishek Bansal
Read Note
Script Usage :: Want to check what logging mode is configured for events like System , Setup, Application , Security logs for all your servers ?? What' the current size of all the events contained in these logs ?? What's the maximum log size of these events ?? For all this, use below script.
Pre requisites :: Copy all the code into a text file, save it with an extension ".PS1". On same location create a text file named "InputServers.txt" which will be containing names of machines. Once saved, run script as Administrator.
Execution & Outputs :: Once executed Output will be saved in a file named "LoggingmodeOutput.csv" and any Errors into "Errorslogs.csv" onto same location. #>
$servers = Get-Content .\InputServers.txt
foreach($server in $servers)
{
$server = $server.trim()
$Error.Clear()
try{
Invoke-Command -ComputerName $server -ErrorAction Stop -ScriptBlock{Get-WinEvent -ListLog Application,Setup,System,Security | Select-Object @{n="Hostname";e={$using:server}},LogName,LastAccessTime,LastWriteTime,@{n="MaximumLogSize(MB)";e={[Math]::Round($($_.MaximumSizeInBytes)/1024/1024,1)}},@{n="CurrentEventSize(MB)";e={[Math]::Round($($_.FileSize)/1024/1024,1)}},@{n="Events Count";e={$_.RecordCount}},@{n="LoggingMode";e={$(if($_.Logmode -eq "Circular"){echo "Overwrite events as needed (Oldest events first)"}elseif($_.Logmode -eq "Retain"){echo "Do not overwrite events (Clear logs manually)"}elseif($_.Logmode -eq "AutoBackup"){echo "Archive the log when full, do not overwrite events)"})}},LogFilePath} | Export-Csv ./LoggingmodeOutput.csv -NoTypeInformation -Append
}
catch
{
$server | Select-Object @{n="Hostname";e={$server}},@{n="ErrorMessage";e={$($Error.Exception.Message)}} | Export-Csv ./Errorlogs.csv -NoTypeInformation -Append
}
}
Sample Output