Skip to content

Commit

Permalink
C# Parser for Printers module.
Browse files Browse the repository at this point in the history
  • Loading branch information
prashant3535 committed Aug 7, 2018
1 parent 0e57879 commit d95c381
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 39 deletions.
116 changes: 78 additions & 38 deletions ADRecon.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,12 @@ namespace ADRecon
return ADRObj;
}

public static Object[] PrinterParser(Object[] ADPrinters, int numOfThreads)
{
Object[] ADRObj = runProcessor(ADPrinters, numOfThreads, "Printers");
return ADRObj;
}

static Object[] runProcessor(Object[] arrayToProcess, int numOfThreads, string processorType)
{
int totalRecords = arrayToProcess.Length;
Expand Down Expand Up @@ -444,6 +450,8 @@ namespace ADRecon
return new ComputerRecordProcessor();
case "ComputerSPNs":
return new ComputerSPNRecordProcessor();
case "Printers":
return new PrinterRecordProcessor();
}
throw new ArgumentException("Invalid processor type " + name);
}
Expand Down Expand Up @@ -1112,6 +1120,34 @@ namespace ADRecon
}
}

class PrinterRecordProcessor : IRecordProcessor
{
public PSObject[] processRecord(Object record)
{
try
{
PSObject AdPrinter = (PSObject) record;

PSObject PrinterObj = new PSObject();
PrinterObj.Members.Add(new PSNoteProperty("Name", AdPrinter.Members["Name"].Value));
PrinterObj.Members.Add(new PSNoteProperty("ServerName", AdPrinter.Members["serverName"].Value));
PrinterObj.Members.Add(new PSNoteProperty("ShareName", ((Microsoft.ActiveDirectory.Management.ADPropertyValueCollection) (AdPrinter.Members["printShareName"].Value)).Value));
PrinterObj.Members.Add(new PSNoteProperty("DriverName", AdPrinter.Members["driverName"].Value));
PrinterObj.Members.Add(new PSNoteProperty("DriverVersion", AdPrinter.Members["driverVersion"].Value));
PrinterObj.Members.Add(new PSNoteProperty("PortName", ((Microsoft.ActiveDirectory.Management.ADPropertyValueCollection) (AdPrinter.Members["portName"].Value)).Value));
PrinterObj.Members.Add(new PSNoteProperty("URL", ((Microsoft.ActiveDirectory.Management.ADPropertyValueCollection) (AdPrinter.Members["url"].Value)).Value));
PrinterObj.Members.Add(new PSNoteProperty("whenCreated", AdPrinter.Members["whenCreated"].Value));
PrinterObj.Members.Add(new PSNoteProperty("whenChanged", AdPrinter.Members["whenChanged"].Value));
return new PSObject[] { PrinterObj };
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
return new PSObject[] { };
}
}
}

//The interface and implmentation class used to handle the results (this implementation just writes the strings to a file)

interface IResultsHandler
Expand Down Expand Up @@ -1295,6 +1331,12 @@ namespace ADRecon
return ADRObj;
}

public static Object[] PrinterParser(Object[] ADPrinters, int numOfThreads)
{
Object[] ADRObj = runProcessor(ADPrinters, numOfThreads, "Printers");
return ADRObj;
}

static Object[] runProcessor(Object[] arrayToProcess, int numOfThreads, string processorType)
{
int totalRecords = arrayToProcess.Length;
Expand Down Expand Up @@ -1344,6 +1386,8 @@ namespace ADRecon
return new ComputerRecordProcessor();
case "ComputerSPNs":
return new ComputerSPNRecordProcessor();
case "Printers":
return new PrinterRecordProcessor();
}
throw new ArgumentException("Invalid processor type " + name);
}
Expand Down Expand Up @@ -2004,6 +2048,34 @@ namespace ADRecon
}
}

class PrinterRecordProcessor : IRecordProcessor
{
public PSObject[] processRecord(Object record)
{
try
{
SearchResult AdPrinter = (SearchResult) record;

PSObject PrinterObj = new PSObject();
PrinterObj.Members.Add(new PSNoteProperty("Name", AdPrinter.Properties["Name"][0]));
PrinterObj.Members.Add(new PSNoteProperty("ServerName", AdPrinter.Properties["serverName"][0]));
PrinterObj.Members.Add(new PSNoteProperty("ShareName", AdPrinter.Properties["printShareName"][0]));
PrinterObj.Members.Add(new PSNoteProperty("DriverName", AdPrinter.Properties["driverName"][0]));
PrinterObj.Members.Add(new PSNoteProperty("DriverVersion", AdPrinter.Properties["driverVersion"][0]));
PrinterObj.Members.Add(new PSNoteProperty("PortName", AdPrinter.Properties["portName"][0]));
PrinterObj.Members.Add(new PSNoteProperty("URL", AdPrinter.Properties["url"][0]));
PrinterObj.Members.Add(new PSNoteProperty("whenCreated", AdPrinter.Properties["whenCreated"][0]));
PrinterObj.Members.Add(new PSNoteProperty("whenChanged", AdPrinter.Properties["whenChanged"][0]));
return new PSObject[] { PrinterObj };
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
return new PSObject[] { };
}
}
}

//The interface and implmentation class used to handle the results (this implementation just writes the strings to a file)

interface IResultsHandler
Expand Down Expand Up @@ -8000,7 +8072,7 @@ Function Get-ADRPrinter
{
Try
{
$ADPrinters = Get-ADObject -LDAPFilter '(objectCategory=printQueue)' -Properties serverName,printShareName,driverName,driverVersion,portName,url,whenCreated,whenChanged,Name
$ADPrinters = @( Get-ADObject -LDAPFilter '(objectCategory=printQueue)' -Properties driverName,driverVersion,Name,portName,printShareName,serverName,url,whenChanged,whenCreated )
}
Catch
{
Expand All @@ -8011,26 +8083,8 @@ Function Get-ADRPrinter

If ($ADPrinters)
{
$cnt = $([ADRecon.ADWSClass]::ObjectCount($ADPrinters))
If ($cnt -ge 1)
{
Write-Verbose "[*] Total Printers: $cnt"
$ADPrintersObj = @()
$ADPrinters | ForEach-Object {
# Create the object for each instance.
$Obj = New-Object PSObject
$Obj | Add-Member -MemberType NoteProperty -Name "Name" -Value $_.Name
$Obj | Add-Member -MemberType NoteProperty -Name "ServerName" -Value $_.serverName
$Obj | Add-Member -MemberType NoteProperty -Name "ShareName" -Value ([string]($_.printShareName))
$Obj | Add-Member -MemberType NoteProperty -Name "DriverName" -Value $_.driverName
$Obj | Add-Member -MemberType NoteProperty -Name "DriverVersion" -Value $_.driverVersion
$Obj | Add-Member -MemberType NoteProperty -Name "PortName" -Value ([string]($_.portName))
$Obj | Add-Member -MemberType NoteProperty -Name "URL" -Value ([string]($_.url))
$Obj | Add-Member -MemberType NoteProperty -Name "whenCreated" -Value $_.whenCreated
$Obj | Add-Member -MemberType NoteProperty -Name "whenChanged" -Value $_.whenChanged
$ADPrintersObj += $Obj
}
}
Write-Verbose "[*] Total Printers: $([ADRecon.ADWSClass]::ObjectCount($ADPrinters))"
$PrintersObj = [ADRecon.ADWSClass]::PrinterParser($ADPrinters, $Threads)
Remove-Variable ADPrinters
}
}
Expand Down Expand Up @@ -8060,29 +8114,15 @@ Function Get-ADRPrinter
If ($cnt -ge 1)
{
Write-Verbose "[*] Total Printers: $cnt"
$ADPrintersObj = @()
$ADPrinters | ForEach-Object {
# Create the object for each instance.
$Obj = New-Object PSObject
$Obj | Add-Member -MemberType NoteProperty -Name "Name" -Value ([string] $($_.Properties.name))
$Obj | Add-Member -MemberType NoteProperty -Name "ServerName" -Value ([string] $($_.Properties.servername))
$Obj | Add-Member -MemberType NoteProperty -Name "ShareName" -Value ([string] $($_.Properties.printsharename))
$Obj | Add-Member -MemberType NoteProperty -Name "DriverName" -Value ([string] $($_.Properties.drivername))
$Obj | Add-Member -MemberType NoteProperty -Name "DriverVersion" -Value ([string] $($_.Properties.driverversion))
$Obj | Add-Member -MemberType NoteProperty -Name "PortName" -Value ([string] $($_.Properties.portname))
$Obj | Add-Member -MemberType NoteProperty -Name "URL" -Value ([string] $($_.Properties.url))
$Obj | Add-Member -MemberType NoteProperty -Name "whenCreated" -Value ([DateTime] $($_.Properties.whencreated))
$Obj | Add-Member -MemberType NoteProperty -Name "whenChanged" -Value ([DateTime] $($_.Properties.whenchanged))
$ADPrintersObj += $Obj
}
$PrintersObj = [ADRecon.LDAPClass]::PrinterParser($ADPrinters, $Threads)
}
Remove-Variable ADPrinters
}
}

If ($ADPrintersObj)
If ($PrintersObj)
{
Return $ADPrintersObj
Return $PrintersObj
}
Else
{
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ When you run ADRecon, a `ADRecon-Report-<timestamp>` folder will be created whic
-Collect <String>
Which modules to run (Comma separated; e.g Forest,Domain. Default all)
Valid values include: Forest, Domain, Trusts, Sites, Subnets, PasswordPolicy, FineGrainedPasswordPolicy, DomainControllers, Users, UserSPNs, Groups, GroupMembers, OUs, ACLs, GPOs, GPOReport, DNSZones, Printers, Computers, ComputerSPNs, LAPS, BitLocker.
Valid values include: Forest, Domain, Trusts, Sites, Subnets, PasswordPolicy, FineGrainedPasswordPolicy, DomainControllers, Users, UserSPNs, PasswordAttributes, Groups, GroupMembers, OUs, ACLs, GPOs, GPOReport, DNSZones, Printers, Computers, ComputerSPNs, LAPS, BitLocker.
-OutputType <String>
Output Type; Comma seperated; e.g CSV,STDOUT,Excel (Default STDOUT with -Collect parameter, else CSV and Excel).
Expand Down Expand Up @@ -147,6 +147,7 @@ When you run ADRecon, a `ADRecon-Report-<timestamp>` folder will be created whic
- Additional export and storage option: export to ~~STDOUT~~, SQLite, ~~xml~~, ~~json~~, ~~html~~.
- Use the EPPlus library for Excel Report generation and remove the dependency on MS Excel.
- List issues identified and provide recommended remediation advice based on analysis of the data.
- Add PowerShell Core support.

### Bugs, Issues and Feature Requests

Expand Down

0 comments on commit d95c381

Please sign in to comment.