0

標準のユーザーアカウントでプログラムを実行すると、Winspool.drv「OpenPrinter」の呼び出しに問題が発生します。しかし、管理者アカウントでプログラムを実行したとき。API呼び出しを適切に実行できます。

このAPIを使用してOpenPrinterを呼び出そうとしています

[DllImport("WinSpool.drv", SetLastError = true)]
static extern unsafe bool OpenPrinter (string pPrinterName, int* phPrinter, void* pDefault);

このコードを使用して実装します

static unsafe int CSOpenPrinter(string printerName)
{
    bool bResult;
    int hPrinter;
    PRINTER_DEFAULTS pd = new PRINTER_DEFAULTS();
    //int rawsize = Marshal.SizeOf(pd);
    //IntPtr pdPtr = Marshal.AllocHGlobal(rawsize);
    //pd.pDatatype = null;
    //pd.pDevMode = null;
    pd.DesiredAccess = PRINTER_ALL_ACCESS;

    bResult = OpenPrinter(printerName, &hPrinter, &pd);
    System.Diagnostics.Debug.WriteLine("bResult: " + bResult);
    if (!bResult)
    {
        throw new ApplicationException("Cannot open printer '" +
                                        printerName + "' " +
                                        Marshal.GetLastWin32Error());
    }
    return hPrinter;
}

繰り返しになりますが、プログラムを「管理者として実行」にしようとすると、そのコードは完全に機能します。アプリケーションを右クリックして[管理者として実行]を選択せず​​に、アプリケーションを管理者として実行するにはどうすればよいですか?

これはUACの問題だと思いますが、これを解決する方法を教えていただけますか?app.manifestを追加することは役に立ちますか?例を教えていただけますか?

すべてに最適

4

2 に答える 2

0

プリンターで何をしようとしていますか? コードはフル アクセスを要求しているため、管理者アクセスが必要です。

プリンターを使用するだけの場合は、PRINTER_ACCESS_USE代わりにアクセスを要求してください。

それが実際に管理プロセスである場合は、適切なマニフェストを実行可能ファイルに追加して、管理アクセスが必要であることをウィンドウに伝えます。

于 2012-05-30T08:29:12.273 に答える
0

Add manifest file to your project. Like here

于 2012-06-26T14:36:19.340 に答える