2014-12-04 118 views
0

我正尝试在C#中使用WMI重命名打印机。我可以运行查询来选择打印机,但是当我尝试调用RenamePrinter方法时,我得到了拒绝访问结果。我尝试以管理员身份运行此应用程序并创建清单,但似乎无法调用此方法,除非我实际上在管理员帐户下运行。以非管理员用户身份调用RenamePrinter

var oSearcher = new ManagementObjectSearcher(oMs, oQuery); 
ManagementObjectCollection oReturnCollection = oSearcher.Get(); 
foreach (ManagementObject oReturn in oReturnCollection) 
{ 
    var objectClass = new ManagementClass("Win32_Printer"); 
    var inParams = objectClass.GetMethodParameters("RenamePrinter"); 

    inParams["NewPrinterName"] = "..."; // something 
    ManagementBaseObject oResult = oReturn.InvokeMethod("RenamePrinter", inParams, null); 

    var result = oResult["returnValue"]; // 5 = Access Denied 

有一些方法可以让我一个普通用户的帐户下调用RenamePrinter - 即使这意味着以管理员身份运行?

回答

0

我一直在试图做到这一点,我发现我不能用某些网络打印机做到这一点,但它与本地打印机一起工作。

我所做的就是从那里发射的PowerShell作为本地管理员并运行它:

public void RenamePrinter(string strCurrentName, string strNewPrinterName) 
{ 
    var newProcessInfo = new System.Diagnostics.ProcessStartInfo 
    { 
     FileName = @"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe", 
     Verb = "runas", 
     CreateNoWindow = true, 
     Arguments = "-Command \"$printer = get-wmiobject win32_printer | where { $_.Name -eq '" + strCurrentName + "' }; $printer.RenamePrinter('" + strNewPrinterName + "')\"" 
    }; 
    System.Diagnostics.Process.Start(newProcessInfo); 
} 

我收到同样的“拒绝访问”错误,当我尝试这与网络打印机(也许这是一个驱动程序的事情我不知道),但这适用于本地打印机。

相关问题