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..."
}