2016-09-23 15 views
0

Я пытаюсь написать службу Windows на C# (VS2010, .NET 4.0), которая действует как долговременный клиент OPC. В зависимости от аргументов командной строки он может запускаться как служба Windows или как приложение WinForms с кнопкой «Старт/Стоп» для эмуляции службы (но ее легче отлаживать).C# COMException как служба Windows, но WinForms OK

В настоящее время я использую Interop.OPCAutomation для совершения вызовов COM. Когда я запускаю приложение WinForms, все работает как ожидалось, никаких ошибок. Но когда я бегу в качестве службы Windows, она не со следующим исключением:

[System.Runtime.InteropServices.COMException: "Нет такой интерфейс не поддерживается" ErrorCode: -2147220990 на OPCAutomation.IOPCAutoServer.Connect (String ProgID , Object Node) в Project.Opc.Collector..ctor (String serverName, IEnumerable`1 tagNames, String machineName, Boolean asynchronous) в C: \ CompanyName \ Projects \ Applications \ Project \ Project.Opc \ Collector1.cs: строка 41

Вот код обижая:

_server = new OPCServer(); //this works OK 

try { 
    _server.Connect(serverName, machineName); // this is where it fails 
} catch (Exception exc) { 
    string message = string.Format("Unable to connect to OPC server {0} on {1}", serverName, machineName); 
    OpcException exception = new OpcException(message, exc); 
    Logger.Log(message, LogLevel.Exception, exception); 
    throw exception; 
} 

Я запускаю версию сервера Windows как SYSTEM, и она не работает с включением и выключением доступа к рабочему столу. Поскольку этот код отлично работает в WinForms, это, вероятно, не проблема OPC. Но я не знаю, почему тот же код не будет работать как услуга.

A related article имеет аналогичную проблему, но остается без ответа. Кто-нибудь еще видел и/или решал эту проблему?

+0

Не каждый объект COM работает в режиме обслуживания Windows. Вы должны спросить своего поставщика о подтверждении. –

ответ

2

Похоже, что учетная запись службы, используемая в службе, не имеет необходимого доступа для COM-компонента, для ее устранения используется учетная запись администратора или учетная запись, используемая для WinForm (текущий пользователь).

Проверьте этот link, который похож на ваш вопрос.

+0

Хорошая идея. Я переключил «Войти в систему» ​​на мою учетную запись домена (admin), и COM работал. Думаю, мне нужно будет запустить этот как Admin. Это сломало некоторые другие несвязанные вещи, мое плохое, но я могу отлаживать их. Но в качестве последующего вопроса есть ли какие-либо «хорошо известные» учетные записи (NETWORK SERVICE, LOCAL SERVER и т. Д.), Которые уже имеют права администратора на вызовы COM? Это упростит мою установку. – CrackingWise

+0

Или добавьте права пользователя с полномочиями (которые требуется COM) для учетной записи, используемой для входа в систему. –