以非管理员用户身份调用重命名打印机

本文关键字:调用 重命名 打印机 身份 用户 管理员 | 更新日期: 2023-09-27 18:32:59

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

以非管理员用户身份调用重命名打印机

我一直在

尝试这样做,我发现我不能用某些网络打印机做到这一点,但在本地打印机上它可以工作。

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

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