我正在尝试使用C#中的WMI重命名打印机。我可以运行查询来选择打印机,但是当我尝试调用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 :(得分: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);
}
当我尝试使用网络打印机时,我收到相同的“拒绝访问”错误(可能是驱动程序的东西?我不知道)但这适用于本地打印机。