2014-12-04 3 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); 
} 

내가 같은 "액세스가 거부되었습니다"오류가 발생 I 몰라)하지만 이것은 로컬 프린터에서 작동합니다.

관련 문제