当我在标准用户帐户中运行程序时,我遇到了调用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会有帮助吗?你能举个例子吗?
最好的所有
答案 0 :(得分:0)
你打算用打印机做什么?您的代码要求完全访问权限,因此需要管理员访问权限。
如果您只想使用打印机,请改为请求PRINTER_ACCESS_USE
。
如果它实际上是一个管理进程,那么add an appropriate manifest可执行文件告诉Windows它需要管理员访问权。
答案 1 :(得分:0)
将清单文件添加到项目中。像here
一样