C#Winspool.drv“无法打开打印机”

时间:2012-05-30 03:58:32

标签: winapi printing

当我在标准用户帐户中运行程序时,我遇到了调用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会有帮助吗?你能举个例子吗?

最好的所有

2 个答案:

答案 0 :(得分:0)

你打算用打印机做什么?您的代码要求完全访问权限,因此需要管理员访问权限。

如果您只想使用打印机,请改为请求PRINTER_ACCESS_USE

如果它实际上是一个管理进程,那么add an appropriate manifest可执行文件告诉Windows它需要管理员访问权。

答案 1 :(得分:0)

将清单文件添加到项目中。像here

一样