2010-02-11 2 views
11

Я запрограммировал службу Windows на C#, которая должна подключаться к базе данных SQL Server 2005 Express с помощью System.Data.SqlClient.Как подключиться к sql-серверу с проверкой подлинности Windows из окна-службы?

Поскольку Microsoft предпочитает использовать проверку подлинности Windows через проверку подлинности SQL, я попытался подключиться к базе данных с надежной связью/интегрированной безопасностью.

Однако это не работает, поскольку я получаю System.Data.SqlClient.SqlException: Ошибка входа для пользователя 'NT AUTHORITY \ LOCAL SERVICE'.

Можно ли войти в систему с другой учетной записью Windows?

ответ

13

В настоящий момент служба отображается в настоящее время под управлением LocalService Account, и эта учетная запись службы в настоящее время не разрешена на SQL.

Ситуацию можно устранить одним из двух способов: запустить учетную запись под учетной записью, которая авторизована в SQL, или добавить учетную запись LocalService в качестве входа в SQL. В частности:

  • Изменение учетной записи службы выполняется как в консоли управления сервисом. (например: «Управление компьютером» и «Службы и приложения»), затем щелкните правой кнопкой мыши «Свойства» в соответствующей службе)
  • В качестве альтернативы, в «Microsoft SQL Management Studio» добавьте учетную запись LSA в качестве логина и установите этот новый принцип (логин) таким образом, чтобы он мог обращаться к желаемым объектам базы данных.

Edit: Первый подход, вероятно, предпочтительнее, так как LocalService счет так pervasively найден в системе, что предоставление ему доступа к SQL подвергнет SQL и базы данных будет конкретный сервис или драйвер, используя его будет скомпрометирован ,
Вместо того, чтобы ввести конкретную учетную запись, у вас больше контроля над тем, кто обращается к объектам SQL и каким образом. Это, конечно же, приводит к необходимости настройки такой учетной записи в отношении привилегий, которые ей должны быть предоставлены, на уровне системы (а не SQL), и в зависимости от того, что делает базовая услуга, возможно, потребуется сделать эту учетную запись довольно мощный, следовательно, потенциальная ответственность другими способами.

+0

спасибо. изменение пользователя для службы звучит хорошо. но как это можно сделать программно? Я хочу сделать это в моей программе C#, а не в консоли управления сервисами. –

+0

@ räph: Некоторое время назад я предложил бы изучить API ADSI, но теперь вы сможете более легко «сходить со счетами» класс .NET System.ServiceProcess.ServiceController. Хотя я использую это для запуска/остановки служб, я никогда не изменял настройку службы таким образом. Другие подходы, которые я видел, порождают сетевую команду (хотя я не верю, что изменение сервиса возможно именно так), а совсем недавно с PowerShell (позволяет изменять свойства сервиса, хотя у меня нет опыта с этим. .). – mjv

+1

LSA означает * Local Security Authorithy *, а не LocalService. http://msdn.microsoft.com/en-us/library/ms721592%28VS.85%29.aspx#_security_local_security_authority_gly#_security_local_security_authority_gly –

1

Вам необходимо предоставить доступ к учетной записи LOCAL SERVICE в SQL Express. В соответствии с моим комментарием, моим советом было бы создать новую учетную запись, которую ваша служба может запускать, а затем добавить соответствующие разрешения в SQL Express, другими словами, не запускайте свою службу в LOCAL SERVICE.

+1

Я думал об этом, но не будет ли каждый сервис получить доступ к моему дБ? –

+0

Все службы, работающие под этой учетной записью, да. Вы должны создать отдельную учетную запись и указать только требуемые разрешения. – James

2

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

3

Когда служба Windows запускается диспетчером управления службами, процесс выполняется как конкретный пользователь, как и любой другой процесс, выполняющийся в ОС.

Существует множество «встроенных» учетных записей пользователей, которые используются для работы служб Windows. Вы можете увидеть полный набор служб Windows и учетную запись, которую они запускают (называемый «Вход в систему как» в Windows 7), если вы посмотрите на узел «Службы» в «Управление компьютером».

Из моего опыта, когда мы хотим, чтобы служба Windows, чтобы поговорить с БД с помощью встроенной системы безопасности, мы принимаем второй подход ниже:

1) Назначьте одну из встроенных учетных записей, как «Log On As» учетной записи и добавить эту учетную запись в качестве входа в экземпляр SQL Server с соответствующими разрешениями базы данных

2) Используйте/создайте локальную учетную запись или учетную запись домена для службы Windows для использования, а затем добавьте эту учетную запись в качестве логина с соответствующей БД разрешения. Возможно, установщик может запросить учетные данные учетной записи пользователя во время установки службы.

Я не могу утверждать, что достаточно экспертом, чтобы указать на все плюсы и минусы каждого подхода, однако стоит учесть следующее:

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

  • с подходом 1 конфигурация пароля управляется самой машиной, но с подходом 2 пароль может управляться администраторами, а также соответствовать любым требуемым политикам безопасности.

Я надеюсь, что это помогает

1

Как MJV сказал, что вам нужно либо дать Локальный доступ учетной записи службы в базу данных или использовать другую учетную запись для запуска службы. Вы спросили, как можно программно изменить учетную запись, которая выполняется путем создания установщика для службы и изменения свойства учетной записи «Пользователь», а затем указания имени пользователя и пароля для запуска службы.

Следующая ссылка содержит информацию о создании установки, если вы прокрутите до конца:

http://msdn.microsoft.com/en-us/library/aa984464(VS.71).aspx

Хотя ниже приводится немного более подробно о собственности счета:

http://msdn.microsoft.com/en-us/library/system.serviceprocess.serviceprocessinstaller.account(VS.71).aspx

Надеюсь, это поможет.

Смежные вопросы