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

将清单文件添加到您的项目中。喜欢这里

于 2012-06-26T14:36:19.340 回答
0

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

如果您只想使用打印机,请PRINTER_ACCESS_USE改为请求访问权限。

如果它实际上是一个管理员进程,则将适当的清单添加到可执行文件中,以告诉 Windows 它需要管理员访问权限。

于 2012-05-30T08:29:12.273 回答