DIR Return Create A Forum - Home
---------------------------------------------------------
social facebook
HTML https://socialfacebook.createaforum.com
---------------------------------------------------------
*****************************************************
DIR Return to: Social Facebook
*****************************************************
#Post#: 86--------------------------------------------------
How to: Remotely Survey the Status of Printers
By: eyeconic Date: April 5, 2018, 9:49 am
---------------------------------------------------------
At any given time at medium and large companies there may be
multiple printers that are not working due to a paper jam or
being out of paper or some other problematic situation. The rich
set of printer properties exposed in the APIs of Microsoft .NET
Framework provide a means for performing a rapid survey of the
states of printers.
Example
The major steps for creating this kind of utility are as
follows.
1.Obtain a list of all print servers.
2.Loop through the servers to query their print queues.
3.Within each pass of the server loop, loop through all the
server's queues and read each property that might indicate that
the queue is not currently working.
The code below is a series of snippets. For simplicity, this
example assumes that there is a CRLF-delimited list of print
servers. The variable fileOfPrintServers is a StreamReader
object for this file. Since each server name is on its own line,
any call of ReadLine gets the name of the next server and moves
the StreamReader's cursor to the beginning of the next line.
Within the outer loop, the code creates a PrintServer object for
the latest print server and specifies that the application is to
have administrative rights to the server.
Note
If there are a lot of servers, you can improve performance by
using the PrintServer(String, String[],
PrintSystemDesiredAccess) constructors that only initialize the
properties you are going to need.
The example then uses GetPrintQueues to create a collection of
all of the server's queues and begins to loop through them. This
inner loop contains a branching structure corresponding to the
two ways of checking a printer's status:
•You can read the flags of the QueueStatus property which is of
type PrintQueueStatus.
•You can read each relevant property such as IsOutOfPaper, and
IsPaperJammed.
This example demonstrates both methods, so the user was
previously prompted as to which method to use and responded with
"y" if he or she wanted to use the flags of the QueueStatus
property. See below for the details of the two methods.
Finally, the results are presented to the user.
C# Copy
// Survey queue status for every queue on every print server
String line;
String statusReport = "\n\nAny problem states are indicated
below:\n\n";
while ((line = fileOfPrintServers.ReadLine()) != null)
{
PrintServer myPS = new PrintServer(line,
PrintSystemDesiredAccess.AdministrateServer);
PrintQueueCollection myPrintQueues = myPS.GetPrintQueues();
statusReport = statusReport + "\n" + line;
foreach (PrintQueue pq in myPrintQueues)
{
pq.Refresh();
statusReport = statusReport + "\n\t" + pq.Name + ":";
if (useAttributesResponse == "y")
{
TroubleSpotter.SpotTroubleUsingQueueAttributes(ref
statusReport, pq);
// TroubleSpotter class is defined in the complete
example.
}
else
{
TroubleSpotter.SpotTroubleUsingProperties(ref
statusReport, pq);
}
}// end for each print queue
}// end while list of print servers is not yet exhausted
fileOfPrintServers.Close();
Console.WriteLine(statusReport);
Console.WriteLine("\nPress Return to continue.");
Console.ReadLine();
To check printer status using the flags of the QueueStatus
property, you check each relevant flag to see if it is set. The
standard way to see if one bit is set in a set of bit flags is
to perform a logical AND operation with the set of flags as one
operand and the flag itself as the other. Since the flag itself
has only one bit set, the result of the logical AND is that, at
most, that same bit is set. To find out whether it is or not,
just compare the result of the logical AND with the flag itself.
For more information, see PrintQueueStatus, the & Operator (C#
Reference), and FlagsAttribute.
For each attribute whose bit is set, the code adds a notice to
the final report that will be presented to the user. (The
ReportAvailabilityAtThisTime method that is called at the end of
the code is discussed below.)
C# Copy
// Check for possible trouble states of a printer using the
flags of the QueueStatus property
internal static void SpotTroubleUsingQueueAttributes(ref String
statusReport, PrintQueue pq)
{
if ((pq.QueueStatus & PrintQueueStatus.PaperProblem) ==
PrintQueueStatus.PaperProblem)
{
statusReport = statusReport + "Has a paper problem. ";
}
if ((pq.QueueStatus & PrintQueueStatus.NoToner) ==
PrintQueueStatus.NoToner)
{
statusReport = statusReport + "Is out of toner. ";
}
if ((pq.QueueStatus & PrintQueueStatus.DoorOpen) ==
PrintQueueStatus.DoorOpen)
{
statusReport = statusReport + "Has an open door. ";
}
if ((pq.QueueStatus & PrintQueueStatus.Error) ==
PrintQueueStatus.Error)
{
statusReport = statusReport + "Is in an error state. ";
}
if ((pq.QueueStatus & PrintQueueStatus.NotAvailable) ==
PrintQueueStatus.NotAvailable)
{
statusReport = statusReport + "Is not available. ";
}
if ((pq.QueueStatus & PrintQueueStatus.Offline) ==
PrintQueueStatus.Offline)
{
statusReport = statusReport + "Is off line. ";
}
if ((pq.QueueStatus & PrintQueueStatus.OutOfMemory) ==
PrintQueueStatus.OutOfMemory)
{
statusReport = statusReport + "Is out of memory. ";
}
if ((pq.QueueStatus & PrintQueueStatus.PaperOut) ==
PrintQueueStatus.PaperOut)
{
statusReport = statusReport + "Is out of paper. ";
}
if ((pq.QueueStatus & PrintQueueStatus.OutputBinFull) ==
PrintQueueStatus.OutputBinFull)
{
statusReport = statusReport + "Has a full output bin. ";
}
if ((pq.QueueStatus & PrintQueueStatus.PaperJam) ==
PrintQueueStatus.PaperJam)
{
statusReport = statusReport + "Has a paper jam. ";
}
if ((pq.QueueStatus & PrintQueueStatus.Paused) ==
PrintQueueStatus.Paused)
{
statusReport = statusReport + "Is paused. ";
}
if ((pq.QueueStatus & PrintQueueStatus.TonerLow) ==
PrintQueueStatus.TonerLow)
{
statusReport = statusReport + "Is low on toner. ";
}
if ((pq.QueueStatus & PrintQueueStatus.UserIntervention) ==
PrintQueueStatus.UserIntervention)
{
statusReport = statusReport + "Needs user intervention.
";
}
// Check if queue is even available at this time of day
// The method below is defined in the complete example.
ReportAvailabilityAtThisTime(ref statusReport, pq);
}
To check printer status using each property, you simply read
each property and add a note to the final report that will be
presented to the user if the property is true. (The
ReportAvailabilityAtThisTime method that is called at the end of
the code is discussed below.)
C# Copy
// Check for possible trouble states of a printer using its
properties
internal static void SpotTroubleUsingProperties(ref String
statusReport, PrintQueue pq)
{
if (pq.HasPaperProblem)
{
statusReport = statusReport + "Has a paper problem. ";
}
if (!(pq.HasToner))
{
statusReport = statusReport + "Is out of toner. ";
}
if (pq.IsDoorOpened)
{
statusReport = statusReport + "Has an open door. ";
}
if (pq.IsInError)
{
statusReport = statusReport + "Is in an error state. ";
}
if (pq.IsNotAvailable)
{
statusReport = statusReport + "Is not available. ";
}
if (pq.IsOffline)
{
statusReport = statusReport + "Is off line. ";
}
if (pq.IsOutOfMemory)
{
statusReport = statusReport + "Is out of memory. ";
}
if (pq.IsOutOfPaper)
{
statusReport = statusReport + "Is out of paper. ";
}
if (pq.IsOutputBinFull)
{
statusReport = statusReport + "Has a full output bin. ";
}
if (pq.IsPaperJammed)
{
statusReport = statusReport + "Has a paper jam. ";
}
if (pq.IsPaused)
{
statusReport = statusReport + "Is paused. ";
}
if (pq.IsTonerLow)
{
statusReport = statusReport + "Is low on toner. ";
}
if (pq.NeedUserIntervention)
{
statusReport = statusReport + "Needs user intervention.
";
}
// Check if queue is even available at this time of day
// The following method is defined in the complete example.
ReportAvailabilityAtThisTime(ref statusReport, pq);
}//end SpotTroubleUsingProperties
The ReportAvailabilityAtThisTime method was created in case you
need to determine if the queue is available at the current time
of day.
The method will do nothing if the StartTimeOfDay and
UntilTimeOfDay properties are equal; because in that case the
printer is available at all times. If they are different, the
method gets the current time which then has to be converted into
total minutes past midnight because the StartTimeOfDay and
UntilTimeOfDay properties are Int32s representing
minutes-after-midnight, not DateTime objects. Finally, the
method checks to see if the current time is between the start
and "until" times.
C# Copy
private static void ReportAvailabilityAtThisTime(ref
String statusReport, PrintQueue pq)
{
if (pq.StartTimeOfDay != pq.UntilTimeOfDay) // If the
printer is not available 24 hours a day
{
DateTime utcNow = DateTime.UtcNow;
Int32 utcNowAsMinutesAfterMidnight = (utcNow.TimeOfDay.Hours *
60) + utcNow.TimeOfDay.Minutes;
// If now is not within the range of available
times . . .
if (!((pq.StartTimeOfDay <
utcNowAsMinutesAfterMidnight)
&&
(utcNowAsMinutesAfterMidnight <
pq.UntilTimeOfDay)))
{
statusReport = statusReport + " Is not
available at this time of day. ";
}
}
HTML https://www.youtube.com/watch?v=9A4ZBCUVeo4
<script>
(function() {
var cx = '017846004531943245215:ntog6z4xfuc';
var gcse = document.createElement('script');
gcse.type = 'text/javascript';
gcse.async = true;
gcse.src = '
HTML https://cse.google.com/cse.js?cx='
+ cx;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(gcse, s);
})();
</script>
<gcse:search></gcse:search>
*****************************************************