Работают ли методы принтера Win32 с сервера против локальной машины?


Недавно я сделал инструмент управления принтером c#, который использует службу WCF, содержащуюWMI Win32_Printer методы, такие какAddPrinterConnection иSetDefaultPrinter .

Все работает нормально, если клиент и служба WCF работают на одной машине. Но если я попытаюсь переместить службу WCF на другую машину, методы перестанут работать, но ничего не произойдет.

AddPrinterConnection, например, возвращает 0, что означает успех, но нет принтера. действительно добавил на местной машине. Принтер по умолчанию, даже если он установлен в значение по умолчанию, возвращает значение false и т. д. Список принтеров каким-то образом доступен.

Служба WCF ведет себя так же, даже если она размещена в IIS с удостоверением администратора для пула приложений или размещена на сервере разработки ASP.

Но с той же идентичностью на локальной машине все в порядке. Имя принтера и адрес локального компьютера передаются в качестве параметров методам WCF.

Это а вопрос прав, делегирования или олицетворения? Является ли это ограничением WMI? Кто-нибудь сталкивался с этой проблемой? Мне действительно нужно решение для этого. Заранее спасибо.

EDIT: Вот некоторый код, представляющий функцию, вызываемую в службе WCF, которая добавляет принтер.

Примечание: как при локальной установке (клиент и служба локальная), так и при удаленной (клиент локальная, служба удаленная) функция возвращает 0, что означает "успех" и отсутствие ошибки, но во втором случае ничего не происходит. действительно добавить.

Я также перепробовал все виды олицетворений, и, как я уже сказал, идентификатор, под которым работает служба WCF, совпадает с пользователем, использующим клиент. I supose-это вещь, связанная с пользовательским контекстом, потому что это не имеет большого смысла. Я попытался найти некоторую информацию от Microsoft относительно этого, но безуспешно.

public static string AddPhysicalPrinter(string sPrinterName, string address)
    {
        try
        {
            ConnectionOptions options = new ConnectionOptions();
            options.Impersonation = ImpersonationLevel.Impersonate;
            options.Authentication = AuthenticationLevel.PacketPrivacy;
            options.EnablePrivileges = true;
            options.Username = "username";
            options.Password = "password";

            oManagementScope = new ManagementScope(new ManagementPath("\\" + address + "\root" + "\cimv2"), options);

            oManagementScope.Connect();

            ManagementClass oPrinterClass = new ManagementClass (new ManagementPath("Win32_Printer"), null);
            ManagementBaseObject oInputParameters = oPrinterClass.GetMethodParameters("AddPrinterConnection");

            oInputParameters.SetPropertyValue("Name", sPrinterName);

           ManagementBaseObject x = oPrinterClass.InvokeMethod("AddPrinterConnection", oInputParameters, null);

            foreach(PropertyData p in x.Properties)
            {
                switch ((UInt32)p.Value)
                {
                    case 0:
                        return "has been added successfuly";//success
                    case 5:
                        return "access denied";//access denied
                    case 1801:
                        return "invalid printer name";//invalid printer name
                    case 1930:
                        return "incompatible printer driver";//incompatible printer driver
                    default:
                        return "unknown error";
                }
            }

            return "unknown error";
        }
        catch (Exception ex)
        {
            return "exception caught";
        }
    }
1 3

1 ответ:

После некоторых исследований я обнаружил, что это невозможно сделать с помощью третьей машины. Это должно быть сделано с помощью локального входа .