none
System.Printing.PrintQueue.Pause()でPrintQueueExceptionが発生して一時停止できない RRS feed

  • 質問

  • はじめまして。VB.NET/.NET Frameworkで質問があります。

    Windows XP Pro SP2上で、Visual Studio 2008 で、VB.NETを使い、.NET Framework 3.5で、下記のようなコードで、プリンタを一時停止させようとしています。

    実行すると、wcDefaultPrintQueue.Pause()の箇所で、System.Printing.PrintQueueException()が発生してしまいます。

    おそらく、プリンタまたは他の箇所へのアクセス権が問題ではないかと思うのですが、どのような権限をどこに付与したらよいでしょうか?

    なお、現在は、

    ・アドミニストレーター権限で実行

    ・一時停止しようとしているプリンタに対して「印刷」「プリンタの管理」「ドキュメントの管理」は「許可(チェックボックスがON)」になっている

    ・マニュフェストファイルで「<requestedExecutionLevel  level="requireAdministrator" uiAccess="true" />」を指定している

    という状態で、権限を付与している状態です。

    これ以外に権限を付与させなければいけない箇所があるのでしょうか?

    または、プログラム上正しくない箇所があるのでしょうか?

    よろしくお願いいたします。

    コード:

            Dim wcLocalPrinterServer As System.Printing.LocalPrintServer = New System.Printing.LocalPrintServer(System.Printing.PrintSystemDesiredAccess.AdministrateServer)
            Dim wcDefaultPrintQueue As System.Printing.PrintQueue = wcLocalPrinterServer.DefaultPrintQueue()
            wcDefaultPrintQueue.Pause()

    発生した例外:

    System.Printing.PrintQueueException がキャッチされました
      Message="キューの一時停止中に例外が発生しました。 Win32 エラー: アクセスが拒否されました。 "
      PrinterName="6F"
      Source="System.Printing"
      StackTrace:
           場所 System.Printing.PrintQueue.Pause()    場所 xxx.xxx.Main() 場所 D:\tmp\NET35PRINTTEST\xxx.vb:行 733
      InnerException:


    • 編集済み oka8801 2012年11月13日 9:41
    2012年11月13日 9:27

すべての返信

  • こんにちは、oka8801 さん
    フォーラムオペレータの佐伯 玲 です。

    出力されているExceptionはPrintQueueに対するアクセスの失敗時に出されるもののようです。

    PrintQueueException クラス
    http://msdn.microsoft.com/ja-jp/library/system.printing.printqueueexception.aspx
    >この例外は、エラー条件によって PrintQueue にアクセスしたり作成したりできない場合にスローされます。


    LocalPrintServer.DefaultPrintQueue プロパティの解説には以下のように記載されておりました。

    LocalPrintServer.DefaultPrintQueue プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.printing.localprintserver.defaultprintqueue(VS.80).aspx
    >プリント サーバーに対する AdministrateServer 権限を保持している場合でも、アプリケーションには、既定のキューへの UsePrinter アクセスしか許可されません。より高いアクセス許可によってキューを開くには、PrintQueue コンストラクタのいずれかを使用して目的のアクセス レベルを指定できるようにします。


    権限に関しては以下が参考になりそうです。

    PrintSystemDesiredAccess 列挙体
    http://msdn.microsoft.com/ja-jp/library/system.printing.printsystemdesiredaccess(VS.80).aspx


    これらの情報は参考になりますでしょうか?

    ご一読いただきoka8801 さんのご質問の参考になれば幸いです。
    __________________________
    日本マイクロソフト株式会社 フォーラム オペレータ 佐伯 玲

    • 回答の候補に設定 佐伯玲 2012年11月30日 6:36
    2012年11月29日 5:52
  • 日本マイクロソフト株式会社 佐伯様

    返信、ありがとうございます。打ち合わせで社外にいたため、まだ詳細の確認ができておりません。詳細確認出来次第別途返信させてください。

    以上、よろしくお願いいたします。

    2012年11月30日 10:52
  • 日本マイクロソフト 佐伯様

    返信ありがとうございます。返信内容を参考に、

    Dim wcLocalPrinterServer As System.Printing.LocalPrintServer = New System.Printing.LocalPrintServer(System.Printing.PrintSystemDesiredAccess.AdministrateServer)

    の下線部をPrintSystemDesiredAccess 列挙体の全ての値で動作を確認してみました。

    AdministratePrinterの場合とUsePrinterの場合には、LocalPrintServer()の生成に失敗し、それ以外の場合には、PrintQueue.Pause()で失敗する結果になりました。

    OSの設定やプリンタの設定あるいはユーザーの設定等、.NETの外側での設定も必要なのではないかと思うのですが、.NETの設定やその他の設定が必要なのでしょうか。

    以上、よろしくお願いいたします。

    以下、PrintSystemDesiredAccess 列挙体の各値で実行時に発生した例外です。

    AdministratePrinter
    {"PrintServer オブジェクトの作成中に例外が発生しました。Win32 エラー: アクセスが拒否されました。 "}
        System.Printing.PrintServerException: {"PrintServer オブジェクトの作成中に例外が発生しました。Win32 エラー: アクセスが拒否されました。 "}
        Data: {System.Collections.ListDictionaryInternal}
        HelpLink: Nothing
        InnerException: Nothing
        Message: "PrintServer オブジェクトの作成中に例外が発生しました。Win32 エラー: アクセスが拒否されました。 "
        Source: "System.Printing"
        StackTrace: "   場所 System.Printing.PrintServer.Initialize(String path, String[] propertiesFilter, PrinterDefaults printerDefaults)    場所 System.Printing.PrintServer..ctor(String path, PrintSystemDesiredAccess desiredAccess)    場所 System.Printing.LocalPrintServer..ctor(PrintSystemDesiredAccess desiredAccess)    場所 xxx.xxx.Main() 場所 D:\tmp\NET35PRINTTEST\xxx.vb:行 730"
        TargetSite: {System.Reflection.RuntimeMethodInfo}


    AdministrateServer
    {"キューの一時停止中に例外が発生しました。 Win32 エラー: アクセスが拒否されました。 "}
        System.Printing.PrintQueueException: {"キューの一時停止中に例外が発生しました。 Win32 エラー: アクセスが拒否されました。 "}
        Data: {System.Collections.ListDictionaryInternal}
        HelpLink: Nothing
        InnerException: Nothing
        Message: "キューの一時停止中に例外が発生しました。 Win32 エラー: アクセスが拒否されました。 "
        Source: "System.Printing"
        StackTrace: "   場所 System.Printing.PrintQueue.Pause()    場所 xxx.xxx.Main() 場所 D:\tmp\NET35PRINTTEST\xxx.vb:行 733"
        TargetSite: {System.Reflection.RuntimeMethodInfo}

    EnumerateServer
    {"キューの一時停止中に例外が発生しました。 Win32 エラー: アクセスが拒否されました。 "}
        System.Printing.PrintQueueException: {"キューの一時停止中に例外が発生しました。 Win32 エラー: アクセスが拒否されました。 "}
        Data: {System.Collections.ListDictionaryInternal}
        HelpLink: Nothing
        InnerException: Nothing
        Message: "キューの一時停止中に例外が発生しました。 Win32 エラー: アクセスが拒否されました。 "
        Source: "System.Printing"
        StackTrace: "   場所 System.Printing.PrintQueue.Pause()    場所 xxx.xxx.Main() 場所 D:\tmp\NET35PRINTTEST\xxx.vb:行 733"
        TargetSite: {System.Reflection.RuntimeMethodInfo}

    None
    {"キューの一時停止中に例外が発生しました。 Win32 エラー: アクセスが拒否されました。 "}
        System.Printing.PrintQueueException: {"キューの一時停止中に例外が発生しました。 Win32 エラー: アクセスが拒否されました。 "}
        Data: {System.Collections.ListDictionaryInternal}
        HelpLink: Nothing
        InnerException: Nothing
        Message: "キューの一時停止中に例外が発生しました。 Win32 エラー: アクセスが拒否されました。 "
        Source: "System.Printing"
        StackTrace: "   場所 System.Printing.PrintQueue.Pause()    場所 xxx.xxx.Main() 場所 D:\tmp\NET35PRINTTEST\xxx.vb:行 733"
        TargetSite: {System.Reflection.RuntimeMethodInfo}

    UsePrinter
    {"PrintServer オブジェクトの作成中に例外が発生しました。Win32 エラー: アクセスが拒否されました。 "}
        System.Printing.PrintServerException: {"PrintServer オブジェクトの作成中に例外が発生しました。Win32 エラー: アクセスが拒否されました。 "}
        Data: {System.Collections.ListDictionaryInternal}
        HelpLink: Nothing
        InnerException: Nothing
        Message: "PrintServer オブジェクトの作成中に例外が発生しました。Win32 エラー: アクセスが拒否されました。 "
        Source: "System.Printing"
        StackTrace: "   場所 System.Printing.PrintServer.Initialize(String path, String[] propertiesFilter, PrinterDefaults printerDefaults)    場所 System.Printing.PrintServer..ctor(String path, PrintSystemDesiredAccess desiredAccess)    場所 System.Printing.LocalPrintServer..ctor(PrintSystemDesiredAccess desiredAccess)    場所 xxx.xxx.Main() 場所 D:\tmp\NET35PRINTTEST\xxx.vb:行 730"
        TargetSite: {System.Reflection.RuntimeMethodInfo}

    2012年12月14日 1:40