Служба Windows с WMI - PullRequest
       68

Служба Windows с WMI

1 голос
/ 01 февраля 2012

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

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

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

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

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

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

0 голосов
/ 01 февраля 2012

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

Примечания

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

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

Редактировать: убедитесь, что вы включаете Олицетворение при подключении к 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 + "'"); 
...