10

印刷キュー内のすべての項目を空にするメソッドを C# で作成しようとしています。以下は私のコードです:

LocalPrintServer localPrintServer = new LocalPrintServer(PrintSystemDesiredAccess.AdministratePrinter); 
PrintQueue printQueue = localPrintServer.GetPrintQueue(printerName);

if (printQueue.NumberOfJobs > 0)
{
    printQueue.Purge();
}

このコードが localPrintServer コンストラクターで実行されると、アプリは次のエラーをスローします。「PrintServer オブジェクトの作成中に例外が発生しました。Win32 エラー: アクセスが拒否されました。」

そのコンストラクターには、いくつかのオーバーロードがあります (パラメーターを送信しないなど)。それらのいずれかを試してみると、その行を通り過ぎますが、printQueue.Purge() 呼び出しに到達すると、上記と同じアクセス拒否メッセージが表示されます。

これを回避するためにどのように/何ができるかの提案を探しています。コンピューターから印刷ジョブを手動で削除できます。アプリが私が持っているのと同じアクセス権で実行されるかどうか、またそれを確認する方法がわかりません。

4

6 に答える 6

2

Web サイトを 4.0 として実行していますか? ウェブサイトを 3.5 から 4.0 フレームワークにアップグレードしたときに問題が発生しました。Print Purging 機能は、4.0 Framework で機能しなくなりました。最終的に、私は 3.5 フレームワークを使用する Web サービスを作成し、4.0 Web サイトが消去したいプリンターを 3.5 Web サービスに通信するようにしました。

(このスレッドを復活させて申し訳ありません。これは、答えを探していたときに偶然見つけたスレッドの1つでした。同じ状況に遭遇した人を助けるなら、これを投稿すると思いました)

于 2016-02-04T16:36:12.573 に答える
1

@mdb ソリューションを使用してみましたが、機能しませんでした (Framework .NET 4.6.1 を使用してアクセスが拒否されました)。だから私は次の解決策を使用することになりました:

void CleanPrinterQueue(string printerName)         
{   
   using (var ps = new PrintServer())
   {
      using (var pq = new PrintQueue(ps, printerName, PrintSystemDesiredAccess.UsePrinter))
      {
         foreach (var job in pq.GetPrintJobInfoCollection())
            job.Cancel();
      }
   }
}
于 2019-01-23T14:15:41.790 に答える
0

//これを例として使用して開始します...

 /// <summary>
 /// Cancel the print job. This functions accepts the job number.
 /// An exception will be thrown if access denied.
 /// </summary>
 /// <param name="printJobID">int: Job number to cancel printing for.</param>
 /// <returns>bool: true if cancel successfull, else false.</returns>
 public bool CancelPrintJob(int printJobID)
 {
      // Variable declarations.
      bool isActionPerformed = false;
      string searchQuery;
      String jobName;
      char[] splitArr;
      int prntJobID;
      ManagementObjectSearcher searchPrintJobs;
      ManagementObjectCollection prntJobCollection;
      try
      {
            // Query to get all the queued printer jobs.
           searchQuery = "SELECT * FROM Win32_PrintJob";
           // Create an object using the above query.
           searchPrintJobs = new ManagementObjectSearcher(searchQuery);
          // Fire the query to get the collection of the printer jobs.
           prntJobCollection = searchPrintJobs.Get();

           // Look for the job you want to delete/cancel.
           foreach (ManagementObject prntJob in prntJobCollection)
           {
                 jobName = prntJob.Properties["Name"].Value.ToString();
                 // Job name would be of the format [Printer name], [Job ID]
                 splitArr = new char[1];
                 splitArr[0] = Convert.ToChar(",");
                 // Get the job ID.
                 prntJobID = Convert.ToInt32(jobName.Split(splitArr)[1]);
                 // If the Job Id equals the input job Id, then cancel the job.
                 if (prntJobID == printJobID)
                 {
                       // Performs a action similar to the cancel
                       // operation of windows print console
                       prntJob.Delete();
                       isActionPerformed = true;
                       break;
                  }
           }
           return isActionPerformed;
      }
      catch (Exception sysException)
      {
           // Log the exception.
           return false;
       }
 }
于 2011-12-01T22:10:10.577 に答える
0

ローカル マシン上のすべてのキューをクリアしても構わない場合は、次のスニペットを使用できます。管理者権限が必要ですが、例外はスローされません:

System.ServiceProcess.ServiceController controller = new   System.ServiceProcess.ServiceController("Spooler");
                controller.Stop();
                System.IO.DirectoryInfo info = new System.IO.DirectoryInfo(@"C:\Windows\System32\spool\PRINTERS");

                var files = info.GetFiles();

                foreach (var file in files)
                {
                    file.Delete();
                }
                controller.Start();
于 2012-03-19T16:17:57.353 に答える
0

最近、.net フレームワークを 4.0 から 4.6.1 にアップグレードした後、同じ問題に遭遇しました。奇妙なことに、私の .net アプリケーションは .net 3.5 で実行されていましたが、何らかの形でこの変更の影響を受けました。

とにかく、アプリケーションを実行する方法はタスク スケジューラを使用していました。修正するには、タスクを右クリックし、一般的に、[最高の特権で実行] という名前のボックスをオンにします。

コンソールで実行する場合、cmdウィンドウを開くときに「管理者として実行」する必要があると思います。

于 2016-06-15T06:56:44.913 に答える