Помилка входу для користувача "DOMAIN \ MACHINENAME $"


120

Я знаю, що це майже дублікат: Помилка "Не вдалося ввійти для користувача" NT AUTHORITY \ IUSR "" в ASP.NET і SQL Server 2008 і не вдалося ввести ім'я користувача "- System.Data.SqlClient.SqlException з LINQ в зовнішня бібліотека проектів / класів, але деякі речі не складаються порівняно з іншими програмами на моєму сервері, і я не знаю, чому.

Використовувані коробки:

Web Box
SQL Box
SQL Test Box

Моя заявка:

У мене є веб-додаток ASP.NET, в якому посилається на бібліотеку класів, яка використовує LINQ до SQL. Рядок з'єднання налаштовано належним чином у бібліотеці класів. Оскільки за входом не вдалося користувачеві ім'я користувача - System.Data.SqlClient.SqlException з LINQ у зовнішній бібліотеці проектів / класів, я також додав цей рядок підключення до веб-програми.

Рядок з'єднання використовує облікові дані SQL так (і в веб-програмі, і в бібліотеці класів):

 <add name="Namespace.My.MySettings.ConnectionStringProduction"
        connectionString="Data Source=(SQL Test Box);Initial Catalog=(db name);Persist Security Info=True;User ID=ID;Password=Password"
        providerName="System.Data.SqlClient" />

Це з’єднання підтвердилось, що він працює, додавши його до Server Explorer. Це рядок підключення, який використовує мій .dbml файл.

Проблема:

Я отримую таку помилку:

System.Data.SqlClient.SqlException: Login failed for user 'DOMAIN\MACHINENAME$'.

Тепер посилаючись на це Помилка "Не вдалося ввійти для користувача" NT AUTHORITY \ IUSR "" в ASP.NET та SQL Server 2008, він говорить, що це дійсно послуга локальної мережі та використання будь-якого іншого доменного імені не працюватиме.

Але я розгублений, тому що перевірив і SQL Box, і SQL Test Box SQL Management Studio, і обидва вони NT AUTHORITY/NETWORK SERVICEзнаходяться в розділі Безпека -> Логіни, на рівні бази даних, що не вказано в розділі Безпека -> Користувачі, але на рівні бази даних Безпека -> Користувачі У мене користувача відображається в рядку з'єднання.

На рівні NTFS на веб-сервері, дозволи мають NETWORK SERVICE має повний контроль.

Причина, чому я плутаюсь, полягає в тому, що у мене на веб-сервері є багато інших веб-додатків, що посилаються на бази даних SQL Box і SQL Test Box, і всі вони працюють. Але я не можу знайти різницю між ними та моїм поточним додатком, окрім того, як я використовую бібліотеку класів. Це буде мати значення? Перевірка дозволів NTFS, налаштування входів у систему безпеки на рівні сервера та баз даних, рядок підключення та спосіб підключення (облікові дані SQL Server) та пул додатків IIS та інші параметри папок - однакові.

Чому ці програми працюють, не додаючи ім'я машини $ до дозволів будь-якого з моїх SQL-ящиків? Але саме це одне посилання підказує мені зробити, щоб вирішити цю проблему.


Отже, для резюме, ви не використовуєте користувача бази даних? Ми створюємо його і можемо перемикатися між ним та SA залежно від того, що нам потрібно зробити ...
jcolebrand

У рядку підключення я використовую користувача бази даних, якого я створив у області Безпека -> Логіни, додав його до Безпеки -> користувачів бази даних та надав йому дозволу dbo. Ось як я робив і всі свої інші програми.
SventoryMang

Ось чітке пояснення від MSDN, використовуючи назву машини за замовчуванням, в основному ви просто додаєте домен / машину $ в sql, не зачіпаючи пошук. blogs.msdn.microsoft.com/ericparvin/2015/04/14/…
Brett Maiwald

Відповіді:


156

NETWORK SERVICE і LocalSystem завжди будуть автентифікувати себе як місцевий обліковий запис (вбудований \ мережевий сервіс та вбудований \ система), але обидва будуть автентифіковані як обліковий запис машини віддалено.

Якщо ви побачите такий збій, Login failed for user 'DOMAIN\MACHINENAME$'це означає, що процес, що працює як NETWORK SERVICE або як LocalSystem, отримав доступ до віддаленого ресурсу, пройшов автентифікацію як обліковий запис машини та отримав відмову в авторизації.

Типовим прикладом може бути додаток ASP, що працює в пулі додатків для використання облікових даних NETWORK SERVICE і підключення до віддаленого SQL Server: пул додатків буде автентифіковано як машина, на якій працює пул додатків, і чи є цей обліковий запис машини, якому потрібно надати доступ .

Якщо доступ до комп'ютерного облікового запису заборонено, то доступ до нього повинен бути наданий. Якщо сервер відмовляється входити з домену "DOMAIN \ MACHINE $", ви повинні надати права входу на "DOMAIN \ MACHINE $", а не на мережеву службу. Надання доступу до мережі NETWORK дозволить локальному процесу, який працює як мережевий сервіс для підключення, а не віддаленому, оскільки віддалений аутентифікується, як ви здогадалися, DOMAIN \ MACHINE $.

Якщо ви очікуєте, що програма asp підключиться до віддаленого SQL Server як логін для входу в SQL, і ви отримаєте винятки щодо DOMAIN \ MACHINE $, це означає, що ви використовуєте інтегровану безпеку в рядку з'єднання. Якщо це несподівано, це означає, що ви накрутили використовувані струни з'єднання.


2
Правильно, що я там зібрався, дякую за пояснення. Однак питання все ще залишається, всі мої програми розміщені на моєму веб-сервері, але отримують доступ до бази даних на тестових полях SQL або SQL, це буде віддалений доступ. Так? Однак вони працюють ... але жодна з моїх скриньок SQL не надає домену DOMAIN \ MACHINENAME $.
SventoryMang

1
Так, я сподіваюся підключитися до SQL-сервера як SQL-логін, але я розмістив рядки підключення, я не використовую опцію Integrated Security = True, що ще могло бути?
SventoryMang

2
Існує три можливі пояснення: 1) вони використовують SQL auth замість інтегрованого auth (який, здається, є найбільш правдоподібним, оскільки у вас, наприклад, є userid та пароль у рядку conn) 2) вони використовують інтегрований auth та працюють у опитуванні додатків який використовує інший обліковий запис або 3) вони використовують інтегрований auth, але додаток ASP видає себе за абонента, тим самим викликаючи обмежене делегування: technet.microsoft.com/en-us/library/cc739587%28WS.10%29.aspx .
Рем Русану

2
Ваш проект веб-додатків повинен посилатися на проект бібліотеки класів , а не на DLL. Додайте проект бібліотеки класів до рішення веб-додатків, потім видаліть посилання на dll та додайте посилання на проект. Таким чином, під час розгортання чи тестування веб-додаток для роздрібної торгівлі буде посилатися на dll-класу роздрібної торгівлі, а налагодження автоматично посилається на налагодження.
Рем Русану

1
Хоча це все добре і добре, як додати машинний вхід до SQL? - Вони обоє в одному домені, і я вважаю за краще використовувати інтегровану безпеку. Але просто додавання облікового запису під назвою "Домен \ MachineName $" повністю не вдається (наприклад, його не існує, а провідник об'єктів задавлюється і не може знайти щось подібне).
BrainSlugs83

33

Ця помилка виникає, коли ви налаштували свою програму за допомогою IIS, і IIS переходить на SQL Server і намагається увійти з обліковими записами, які не мають належних прав. Ця помилка може виникнути також при налаштуванні реплікації чи дзеркального відображення. Я буду над рішенням, яке працює завжди і дуже просте. Перейдіть до SQL Server >> Безпека >> Логін та клацніть правою кнопкою миші на NT AUTHORITY \ NETWORK SERVICE та виберіть Properties

На щойно відкритому екрані Властивості входу перейдіть на вкладку "Картографування користувачів". Потім на вкладці "Картографування користувача" виберіть потрібну базу даних, особливо базу даних, для якої відображається це повідомлення про помилку. На нижньому екрані перевірте роль db_owner. Натисніть кнопку ОК.


7
Це було рішенням для мене, оскільки веб-додаток та база даних знаходяться на одній машині. У мене все ще з’явилася помилка "Не вдалося ввійти для користувача" DOMAIN \ MACHINENAME $ ", але додавання машини до входу в SQL не допомогло, але додавання" NT AUTHORITY \ NETWORK SERVICE "зробило. Хоча ви не повинні використовувати роль db_owner, якщо вона не потрібна, достатньо нормального db_datareader та db_datawriter.
JimiSweden

18

У моєму випадку я мав Identity="ApplicationPoolIdentity"для мого пулу додатків IIS.

Після того, як я додав IIS APPPOOL\ApplicationNameкористувача до SQL Server, він працює.


5
Я вважаю, що це спрацює лише в тому випадку, якщо IIS та SQL-сервер знаходяться на одній машині.
Роб Девіс

1
Це працювало для мене! У мене локальна настройка сервера IIS-SQL.
Він Шахдар

1
Велике спасибі. Ця проблема почалася для мене після оновлення мого локального середовища розробки з SQL Server 2014 до 2017 року. Вашою пропозицією стала срібна куля в цій ситуації.
MFry

Дякую, працювали і для мене. Що я хотів би підкреслити, це те, що повідомлення про помилку все ще залишається "Не вдалося ввійти для користувача" DOMAIN \ MACHINENAME $ ", хоча пул додатків встановлено для роботи під ідентифікацією пулу, і вхід не вдається, навіть якщо" DOMAIN \ MACHINENAME $ "насправді надано дозволи на підключення. Здається, що мені вводять в оману повідомлення про помилку.
mivra

16

В основному, щоб вирішити це, нам потрібно мати деякі налаштування

  • Веб-додаток працює під ApplicationPoolIdentity
  • Веб-додаток, що підключається до баз даних через ADO.Net за допомогою автентифікації Windows у рядку з'єднання

Рядок підключення, що використовується при автентифікації Windows, включає або Trusted_Connection=Yesатрибут, або еквівалентний атрибут Integrated Security=SSPIу Web.configфайлі

Моє підключення до бази даних знаходиться в режимі автентифікації Windows. Тому я вирішив це, просто змінивши ідентифікацію пулів додатків з ApplicationPoolIdentity на мій журнал домену в облікові дані DomainName \ MyloginId

Крок:

  1. Клацніть на пулове програм
  2. Виберіть Ім'я своєї програми

  3. Перейдіть до розширених налаштувань

  4. Розгорніть модель процесу та натисніть Ідентичність . Клацніть три крапки праворуч.
  5. Натисніть кнопку Встановити ... та надайте облікові дані для входу в домен

Для мене це було вирішено.

Примітка. У виробничому та ІТ-середовищі у вас може бути обліковий запис служби під одним доменом для ідентифікації пулу додатків. Якщо так, скористайтеся обліковим записом служби замість свого входу.


На вищезазначене питання це повинна бути прийнята відповідь.
makil

14

Трюк, який працював для мене, полягав у тому, щоб видалити Integrated Securityз моєї рядка з'єднання та додати звичайну User ID=userName; Password=passwordрядок з'єднання у App.configвашій бібліотеці, можливо, не використовується інтегрована безпека, але створена в Web.configце!


3
Мільярд подяк вам Величезна, величезна допомога. Дякую, дякую, дякую. Це, я впевнений, дуже очевидно, але для майбутніх людей це User Id = щось; Пароль = щось;
shubniggurath

2
Я отримував таку ж помилку в назві посади. Я виявив, що "User ID = yourUserid Password = yourPassword" ігнорується, коли "" довірене з'єднання = true "знаходиться в рядку підключення до бази даних. Я видалив "" довірене з'єднання = справжнє "" зі свого рядка, і це вирішило мою проблему. Це не відбулося, поки я не перемістив програму з налагодження у VS 2012 на
iis

12

У колеги була така ж помилка, і це було пов’язано з невеликою помилкою конфігурації в IIS.
Для веб-програми був призначений неправильний пул додатків.

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

У своєму локальному менеджері IIS -> Сайти -> Веб-сайт за замовчуванням -> Ім'я нашого веб-додатка -> Основні налаштування ... Пул додатків був "DefaultAppPool" замість нашого спеціального пулу програм.

Налаштування правильного пулу додатків вирішило проблему.


11

Я додав <identity impersonate="true" />до свого web.config, і він працював чудово.


7
Просто зрозумійте, що це змінить контекст, під яким програма ASP.NET працює в повному обсязі. Замість того, щоб працювати у контексті "МЕРЕЖНОГО ОБСЛУГОВУВАННЯ" за замовчуванням, тепер він запускатиметься в контексті користувача, який використовує додаток (тобто Домен \ someUser). Іноді це нормально, але просто зрозуміти, що ця зміна не є лише швидким виправленням ОП і має інші наслідки, які можуть / не можуть бути бажаними.
atconway


6

Для мене проблема була вирішена, коли я замінив типовий Вбудований акаунт "ApplicationPoolIdentity" на мережевий обліковий запис, якому було дозволено доступ до бази даних.

Налаштування можна здійснити на Інтернет-сервері інформації (IIS 7+)> Пули програм> Додаткові налаштування> Модель процесу> Ідентифікація



3

Ми отримували подібні повідомлення про помилки під час обробки бази даних служб аналізу. Виявилося, що ім’я користувача, яке використовувалося для запуску екземпляра служб Analysis Services, не було додано до входів безпеки SQL Server.

У службі SQL Server 2012 служби SQL Server та Аналіз налаштовані так, щоб вони працювали за замовчуванням як різні користувачі. Якщо ви вже користувалися типовими налаштуваннями, завжди переконайтеся, що користувач AS має доступ до вашого джерела даних!


1
У мене була така ж проблема. Помилка SSAS однакова, але обліковий запис не є мережевою службою. Рахунок насправді: NT Service \ MSOLAP $ INSTANCENAME
cdonner

2

Перевірте, чи є у вас

User Instance=true

в рядку з'єднання. Спробуйте видалити його, що вирішить вашу проблему.


2

У мене також була помилка з користувачем, який перевіряв автентичність на SQL Server

Я спробував деякі виправлення, але вони не спрацювали.

У моєму випадку рішенням було налаштувати його "Режим автентифікації сервера", щоб дозволити аутентифікацію SQL Server у розділі "Студія управління: Властивості / безпека".


1

Єдиний момент, який, здається, всі не помітили, - це те, що ви можете хотіти інтегрованої безпеки = true. Можливо, на вашому сайті працює обліковий запис пулу. Це все добре, і все-таки можна потрапити на сервер SQL за допомогою оригінальних облікових даних користувачів, а не в пулі. Це називається обмеженою делегацією. Якщо ввімкнути це і налаштувати SPN-вікна, перекладатимуть облікові дані пулу з користувачем на запити, що надходять на остаточну службу (SQL - лише одна така послуга). Ви повинні зареєструвати єдиний і єдиний SQL-сервер, який обслуговує запити SQL на веб-сервері. Налаштування цього все для мене занадто багато, щоб намагатися тут точно описати. Сам мені знадобилося досить часу, щоб пропрацювати це.


0

Я провів кілька годин, намагаючись виправити проблему, і нарешті зрозумів це - браузер SQL Server був "Зупинений". Виправлення полягає в тому, щоб змінити його на режим "Автоматичний":

Якщо його вимкнено, перейдіть до Панелі управління-> Адміністративні інструменти-> Послуги та знайдіть агент SQL Server. Клацніть правою кнопкою миші та виберіть "Властивості". У спадному меню "Тип запуску" перейдіть з "Відключений" на "Автоматичний".

цитата звідси


0

У мене була та сама проблема раніше, видалення Persist Security Info=Trueз stringstring працювало на мене.


0

Я зіткнувся з цією проблемою, коли клієнт перейменував SQL Server. Служба звітування SQL була налаштована для підключення до старого імені сервера, для якого вони також створили псевдонім для переадресації до IP нового імені сервера.

Усі їхні старі програми IIS працювали, переадресовуючи нове ім’я сервера через псевдонім. Почувши, я перевірив, чи працюють у них SSRS. Спроба підключитися до сайту SSRS Дала помилку:

"Послуга недоступна. Зверніться до системного адміністратора, щоб вирішити проблему. Системні адміністратори: сервер звітів не може підключитися до своєї бази даних. Переконайтеся, що база даних працює та доступна. Ви також можете перевірити журнал слідів на сервері звітів для отримання детальної інформації . "

Він працював на сервері, але не вдалося підключитися, оскільки він використовував псевдонім для старого імені сервера. Переконфігуруйте SSRS для використання нового імені сервера замість старого / виправленого псевдоніма.


0
  1. Змінення ідентичності пулу додатків на локальну систему
  2. У SQL Mgmt> Безпека> Логіни
    1. Двічі клацніть на NT AUTHORITY \ SYSTEM
    2. Визначення користувачів> Перевірте свою базу даних та надайте їй роль нижче.
    3. Пам’ятайте також про створення бази даних про логіни безпеки з правильним паролем.

0

Я отримав цю помилку під час тестування рішення, використовуючи наступне

string cn = "Data Source=[servername];Integrated Security=true;Initial Catalog=[dbname];";

Я вирішив такий спосіб: мені довелося відкрити Visual Studio і запустити його під іншим обліковим записом, оскільки обліковий запис, який я використовував для відкриття, не був моїм обліковим записом адміністратора.

Тож якщо ваша проблема схожа на мою: прив’яжіть VS до панелі завдань, а потім натисніть клавішу Shift та клацніть правою кнопкою миші, щоб відкрити меню, щоб ви могли відкрити VS як інший користувач. введіть тут опис зображення


0

Я вдячний, що тут є кілька хороших відповідей, але оскільки я просто втратив час на це, сподіваюся, це може комусь допомогти.

У моєму випадку все працювало нормально, а потім без видимих ​​причин зупинилось із помилкою, зазначеною у питанні.

IIS працює як мережевий сервіс, і мережевий сервіс раніше був налаштований на SQL Server (див. Інші відповіді на цю публікацію). Ролі сервера та відображення користувачів виглядали правильно.

Питання було; абсолютно без видимих ​​причин; Мережевий сервіс перейшов на "Заборонити" права входу в базу даних.

Виправити:

  1. Відкрийте SSMS> Безпека> Логіни.
  2. Клацніть правою кнопкою миші "NT AUTHORITY \ NETWORK SERVICE" та натисніть "Властивості".
  3. Перейдіть на вкладку "Статус" і встановіть значення Permission to Connect To Database Engine"Грант".

Дозволено мережевий сервіс

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.