【问题标题】:Invoke RenamePrinter as a non-administrator user以非管理员用户身份调用 RenamePrinter
【发布时间】:2014-12-04 05:12:50
【问题描述】:

我正在尝试在 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——即使这意味着以管理员身份运行?

【问题讨论】:

    标签: c# wmi


    【解决方案1】:

    我一直在尝试这样做,但我发现我无法使用某些网络打印机执行此操作,但使用本地打印机可以。

    我所做的是以本地管理员身份启动 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);
    }
    

    当我尝试使用网络打印机进行此操作时,我收到相同的“拒绝访问”错误(可能是驱动程序问题?我不知道),但这适用于本地打印机。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      相关资源
      最近更新 更多