为什么我得到ERROR_ACCESS_DENIED试图打开使用OpenPrinter具体的工作?(W

2019-09-24 01:39发布

据undocprint给它应该可以检索使用作业的假脱机文件的作业ID OpenPrinterReadPrinter使用字符串格式“PrinterName的,工作XXXX”打开打印机。 在MSDN文档列出这个方法好,虽然用逗号“PrinterName的,工作XXXX”后,额外的空间。

每当我试图从我的测试应用程序调用此方法(使用字符串格式),我得到ERROR_ACCESS_DENIED (Windows 8的64位)。 这是为什么,什么,我需要做的就是这个工作?

我运行测试程序作为管理员,没有问题暂停工作或印表机或访问其它信息。

我知道我使用的ID是有效的,因为对于无效的ID返回ERROR_INVALID_PRINTER_NAME代替。

我正在使用的代码:

public static void OpenPrinter(String printerName,
                               ref IntPtr printerHandle,
                               ref PRINTER_DEFAULTS defaults) {
    if (OpenPrinter(printerName, ref printerHandle, ref defaults) == 0) {
        throw new Win32Exception(Marshal.GetLastWin32Error(),
                                 string.Format("Error getting access to printer: {0}", printerName));
    }
}

[DllImport("winspool.drv", EntryPoint = "OpenPrinterW", SetLastError = true, CharSet = CharSet.Unicode,
    ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int OpenPrinter(String pPrinterName, ref IntPtr phPrinter, ref PRINTER_DEFAULTS pDefault);

[StructLayout(LayoutKind.Sequential)]
public struct PRINTER_DEFAULTS {
    public IntPtr pDatatype;
    public IntPtr pDevMode;
    public uint DesiredAccess;
}

Answer 1:

原来, pDefaults必须传递NULL ,然后一切正常。

这需要改变的extern定义,将一个IntPtr或相似。

我还没有看到这可能是为什么(其实任何文件MSDN文档的状态,这通过NULL应该是一样的,要求使用Access),但它绝对是修复该问题在我们的测试。



Answer 2:

权限。 你是否具有管理员权限运行?



文章来源: Why do I get ERROR_ACCESS_DENIED attempting to open a specific job using OpenPrinter?