Путь поиска DLL службы Windows - PullRequest
       26

Путь поиска DLL службы Windows

3 голосов
/ 08 сентября 2010

Я разработал службу Windows, используя .net.Моя служба выполняет некоторые вызовы неуправляемого кода, как показано ниже:

[DllImport("cmxConnect.dll")]
private unsafe static extern String cmxQuery([MarshalAs(UnmanagedType.LPStr)] String s, long* connPointer);

Я разместил cmxConnect.dll в той же папке, что и исполняемый файл службы.Служба запускается нормально, если я установил учетную запись в качестве учетной записи моего домена.Но если я запускаю службу, используя учетную запись локальной системы, я получаю DLL не найдены исключения.Я предполагаю, что в настройках моей среды есть что-то, что позволяет Windows найти cmxConnect.dll.Может кто-то указать, что именно это?

Ответы [ 4 ]

1 голос
/ 08 сентября 2010

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

1 голос
/ 08 сентября 2010

Учетная запись локальной системы довольно мощная. Возможно, что порядок поиска DLL отключен для этой учетной записи в целях безопасности. (Если поиск продолжается только по имени, и кому-то удается поместить вредоносную DLL где-то в порядке поиска, значит, у вас есть уязвимость, связанная с повышением привилегий.) Если это служба .NET, вы, вероятно, захотите добавить свою DLL в ваш манифест и установите вашу DLL в GAC. (Я не парень .NET. Я только что слышал эти термины раньше.)

0 голосов
/ 08 сентября 2010

Как я понимаю, атрибут DllImport просто оборачивает вызов LoadLibrary, поэтому должен применяться стандартный Порядок поиска в динамической библиотеке ссылок .

Службы будут работать в гораздо более ограниченной среде, чтокод пользователя - я вижу, что было бы нежелательно загружать dll из любого места, кроме папки exe и System32 - везде остальное открывается для атаки с предварительной загрузкой, и это было бы довольно серьезно для службы.

Это может быть так просто: сервисы могут искать dll только из System32?

Надежные местоположения для поиска dll:

  1. Когда передается явный путь, он очищается для LoadLibraryчто приложение знает, какую DLL он хочет.Можете ли вы передать полный путь к DllImport?
  2. Наиболее надежное, не полностью квалифицированное место для поиска dll находится в WinSxS - если вы создаете dll самостоятельно, возможно, его развертывание как нативной сборки Side by side являетсяопция.
  3. Собственная папка exe.Обычно.Я не могу себе этого представить, потому что сервис - это приложение .net, которое не подойдет.Но ясно, что здесь есть проблема.
  4. System32 - вам может потребоваться установить ее здесь.
0 голосов
/ 08 сентября 2010

Я предполагаю здесь, но вы проверили переменные среды. Ваша локальная система A / C имеет такой же набор Env. Варс?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...