Недавно я создал инструмент управления принтером ac #, который использует службу WCF, которая содержит WMI Win32_Printer , такие как AddPrinterConnection и SetDefaultPrinter .
Все работает нормально, если и клиент, и служба WCF работают на одном компьютере.Но если я пытаюсь переместить службу WCF на другую машину, методы перестают работать, но ничего не происходит.
Например, AddPrinterConnection возвращает 0, что означает успех, но на локальном компьютере принтер не добавляется.Принтер по умолчанию, даже если для него задано значение по умолчанию, возвращает значение false и т. Д. Список принтеров так или иначе доступен.
Служба WCF ведет себя так же, даже если она размещена в IIS с удостоверением администратора для пула приложений или размещена вСервер разработки ASP на сервере.
Но с таким же удостоверением на локальной машине все нормально.Имя принтера и адрес локального компьютера отправляются в качестве параметров для методов WCF.
Это проблема с правами, делегированием или олицетворением?Это ограничение WMI?Кто-нибудь сталкивался с этой проблемой?Мне действительно нужно решение для этого.Заранее спасибо.
РЕДАКТИРОВАТЬ: Вот некоторый код, представляющий функцию, вызываемую в службе WCF, которая добавляет принтер.
Примечание: в обеих локальных установках (клиенти service local) и remote (клиент локальный, service remote) функция возвращает 0, что означает «успех» и никаких ошибок, но во втором случае ничего действительно не добавляется.
Я тоже пробовал все виды подделок,и, как я уже сказал, идентичность, под которой работает служба WCF, такая же, как у пользователя, который использует клиента.Я полагаю, что это связано с пользовательским контекстом, потому что это не имеет особого смысла.Я пытался найти информацию от 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";
}
}