2012-02-01 3 views
1

Для одного из моих клиентов я пишу службу Windows на C#. Он проверяет много вещей, но 1 вещь, которую он должен сделать, это проверить, существует ли принтер (IP-адрес). если да, подключите определенный принтер к ip-порту. Если нет, создайте порт и подключитесь в конце концов.Служба Windows с WMI

Я использую WMI для проверки существующих портов принтера и их создания. Я также использую WMI для подключения принтера к порту принтера.

В Windows 7 это работает как шарм. Но на моей (виртуальной) машине XP у службы вообще нет каких-либо прав WMI. Проверка порта завершается с ошибкой, и создание не выполняется. Дается просто «доступ запрещен» из ManagementException.

Если я создаю небольшую пробную программу (консольное приложение на C#), она работает как шарм.

Я попытался запустить службу под разными учетными записями (локальная система, администратор, мой личный логин с правами администратора), ничего не работает, и я получаю ощущение, что вы не можете использовать WMI в службе Windows в Windows XP.

Есть ли у вас какие-либо подсказки, как это исправить? Или что здесь не так?

Не знаю, где еще искать ответы, поэтому я сделал учетную запись здесь, надеясь найти правильный ответ с вами.

ответ

0

Вы используете Win32_Printer? На справочной странице Win32_Printer, он говорит,

Замечания

Класс Win32_Printer является производным от CIM_Printer. Прежде чем вызывать SWbemObject.Put_ или IWbemServices :: PutInstance для экземпляра Win32_Printer, должна быть разрешена привилегия SeLoadDriverPrivilege (wbemPrivilegeLoadDriver для Visual Basic и LoadDriver для прошивок сценариев). Дополнительные сведения см. В разделе «Привилегированные константы» и «Выполнение привилегированных операций». Следующий пример кода VBScript показывает, как включить привилегию SeLoadDriverPrivilege в скрипте.

Редактировать: Я знаю, что существует разница между Windows Server 2003 и Server 2008, когда речь идет о службах. В старых операционных системах (возможно, XP включен) профиль пользователя по умолчанию не загружается. У этого есть проблемы при попытке использовать API DPAPI. Возможно, что-то подобное происходит в этой ситуации. Только догадка.

Редактировать: Убедитесь, что вы активируете олицетворение при подключении к WMI. На странице Win32_TCPIPPrinterPort приведен пример.

ConnectionOptions options = new ConnectionOptions(); 
options.Impersonation = System.Management.ImpersonationLevel.Impersonate; 

ManagementScope scope = new ManagementScope(@"\\root\\cimv2", options); 
scope.Connect(); 
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_TCPIPPrinterPort where HostAddress = '" + printerPort + "'"); 
+0

Да, я использую WIN32_Printer. Но он работает с консольным приложением на том же компьютере XP. – Aspage

+0

Исправление: я использую WMI, который ссылается на папку/класс Win32_Printer в WMI. Я не использую Win32_Printer напрямую, чтобы все было сделано. – Aspage

+0

Win32_Printer - класс WMI. Если вы не используете Win32_Printer, который использует класс WMI? –

0

Есть две вещи, которые вы могли бы попробовать, прежде всего вы можете попытаться установить некоторые учетные данные на вашем ConnectionOptions

ConnectionOptions options = new ConnectionOptions(); 
options.Username = userName; 
options.Password = password; 
options.EnablePrivileges = true; 

Другой подход может быть, окружив весь код в некотором олицетворения обмане, но Я бы определенно попытался сначала взглянуть на ConnectionOptions.

Если вы хотите попробовать бит олицетворения, я написал об этом в блоге. http://beddet.wordpress.com/2011/09/25/remote-controlling/