用户“ DOMAIN \ MACHINENAME $”的登录失败


120

我知道这几乎是重复的:错误“登录失败,用户NT AUTHORITY \ IUSR“”在ASP.NET和SQL Server 2008用户登录失败“用户名” - System.Data.SqlClient.SqlException与LINQ中外部项目/类库,但是与我服务器上的其他应用程序相比,有些东西没有加起来,我不确定为什么。

使用的盒子:

Web框
SQL框
SQL测试框

我的应用程序:

我有一个ASP.NET Web应用程序,该应用程序引用了使用LINQ-to-SQL的类库。在类库中正确设置了连接字符串。由于用户“用户名”的登录失败-外部项目/类库中带有LINQ的System.Data.SqlClient.SqlException,我也将此连接字符串添加到了Web应用程序中。

连接字符串按原样使用SQL凭据(在Web应用程序和类库中):

 <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" />

通过将其添加到服务器资源管理器中,确认该连接正常。这是我的.dbml文件使用的连接字符串。

问题:

我收到以下错误:

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

现在引用此错误在ASP.NET和SQL Server 2008中出现错误“用户'NT AUTHORITY \ IUSR'的登录失败”,它表示实际上是本地网络服务,使用任何其他非域名都将无效。

但是我很困惑,因为我已经选中了SQL Box和SQL Test Box SQL Management Studio,并且都NT AUTHORITY/NETWORK SERVICE在数据库级别的“安全性->登录名”下,未在“安全性->用户”下列出,但是在数据库级->用户我在连接字符串中显示了用户。

在Web服务器上的NTFS级别上,权限对NETWORK SERVICE具有完全控制权。

之所以感到困惑,是因为我的Web服务器上还有许多其他Web应用程序,它们同时引用SQL Box和SQL Test Box上的数据库,并且它们都可以工作。但是除了使用类库之外,我无法找到它们与当前应用程序之间的区别。那会重要吗?检查NTFS权限,在服务器和数据库级别设置安全登录,连接字符串和连接方法(SQL Server凭据)以及IIS应用程序池和其他文件夹选项都是相同的。

为什么这些应用程序可以在不将machinename $添加到我的两个SQL框的权限的情况下工作?但这就是一个链接告诉我要解决此问题。


回顾一下,您不是在使用数据库用户吗?我们创建一个文件,并可以根据需要在它和SA之间进行切换...
jcolebrand 2010年

在连接字符串中,我使用的是数据库用户,该用户是在“安全性”->“登录名”区域中创建的,并将其添加到“安全性”->“数据库用户”中,并赋予了它dbo权限。这也是我完成所有其他应用程序的方式。
SventoryMang 2010年

这是从MSDN使用默认计算机名的明确解释,基本上,您只需将域/计算机$添加到sql中,而无需点击搜索。blogs.msdn.microsoft.com/ericparvin/2015/04/14/...
布雷特Maiwald

Answers:


156

NETWORK SERVICE和LocalSystem始终将自己作为本地的对应帐户(内置\网络服务和内置\系统)进行身份验证,但是两者都将作为远程计算机帐户进行身份验证。

如果您看到类似的故障Login failed for user 'DOMAIN\MACHINENAME$',则表明作为NETWORK SERVICE或LocalSystem运行的进程已访问了远程资源,已将自身身份验证为计算机帐户并被拒绝授权。

典型示例是在应用程序池中运行的ASP应用程序,该应用程序池设置为使用NETWORK SERVICE凭据并连接到远程SQL Server:该应用程序池将通过运行该应用程序池的计算机进行身份验证,并且该计算机帐户需要被授予访问权限。

如果拒绝对计算机帐户的访问,则必须将访问权限授予该计算机帐户。如果服务器拒绝登录“ DOMAIN \ MACHINE $”,那么您必须授予“ DOMAIN \ MACHINE $”的登录权限,而不是NETWORK SERVICE。授予对NETWORK SERVICE的访问权限将允许以NETWORK SERVICE身份运行的本地进程(而不是远程进程)连接,因为您猜到该远程进程将通过DOMAIN \ MACHINE $进行身份验证。

如果您期望asp应用程序作为SQL登录名连接到远程SQL Server,并且获得有关DOMAIN \ MACHINE $的异常,则意味着您在连接字符串中使用Integrated Security。如果这是意外情况,则表示您已拧紧使用的连接字符串。


2
我所收集的信息正确,谢谢您的解释。但是,问题仍然存在,我所有的应用程序都托管在Web服务器上,但是可以通过SQL或SQL Test Box访问数据库,这是远程访问吗?但是它们正在工作...但是我的SQL框均未授予DOMAIN \ MACHINENAME $访问权限。
SventoryMang 2010年

1
哦,另外,我确实希望以SQL登录名的身份连接到SQL Server,但是我发布了连接字符串,我没有使用Integrated Security = True选项,还可能是什么?
SventoryMang 2010年

2
可能有以下三种解释:1)他们使用SQL身份验证而不是集成身份验证(这似乎是最合理的一种,因为您的示例在conn字符串中有一个用户名和密码)2)他们使用集成身份验证并在应用程序轮询中运行使用不同的凭据或3)他们使用集成身份验证,但是ASP应用程序模拟了调用者,从而触发了受约束的委派:technet.microsoft.com/en-us/library/cc739587%28WS.10%29.aspx
雷木斯·鲁萨努

2
您的Web应用程序项目应引用类库项目,而不是dll。将类库项目添加到Web应用程序解决方案中,然后删除对dll的引用并添加对项目的引用。这样,在部署或测试时,零售Web应用将自动引用零售类dll,而debug将自动引用debug。
雷木斯·鲁萨努

1
尽管这一切都很好,但如何将计算机登录名添加到SQL?-它们都在同一个域中,我希望使用集成安全性。但是,仅添加名为“ Domain \ MachineName $”的帐户完全会失败(例如,它不存在,并且对象资源管理器阻塞并且无法找到类似的内容)。
BrainSlugs83 '18

33

当您使用IIS配置应用程序时,会发生此错误,并且IIS转到SQL Server并尝试使用没有适当权限的凭据登录。设置复制或镜像时也会发生此错误。我将介绍一个始终有效且非常简单的解决方案。转到SQL Server >>安全>>登录,然后右键单击NT AUTHORITY \ NETWORK SERVICE,然后选择“属性”。

在新打开的登录属性屏幕中,转到“用户映射”选项卡。然后,在“用户映射”选项卡上,选择所需的数据库,尤其是显示该错误消息的数据库。在下部屏幕上,检查角色db_owner。单击确定。


7
这是我的解决方案,因为Web应用程序和数据库位于同一台计算机上。我仍然收到错误“用户'DOMAIN \ MACHINENAME $登录失败”,但是将计算机添加到SQL登录没有帮助,但是添加了“ NT AUTHORITY \ NETWORK SERVICE”。尽管除非需要,否则不应使用角色db_owner,但是通常db_datareader和db_datawriter就足够了。
JimiSweden '16

18

在我的情况下,我拥有Identity="ApplicationPoolIdentity"IIS应用程序池。

IIS APPPOOL\ApplicationName用户添加到SQL Server后,它可以工作。


5
我相信这仅在IIS和SQL Server在同一台计算机上时才有效。
罗布·戴维斯

1
这对我有用!我有本地IIS-SQL服务器设置。
Vin Shahrdar,

1
非常感谢你。将本地开发环境从SQL Server 2014升级到2017后,这个问题对我来说就开始了。您的建议是在这种情况下的灵丹妙药。
MFry

谢谢,也为我工作。我想强调的是,即使应用程序池设置为在池标识下运行,错误消息仍然是“用户DOMAIN \ MACHINENAME $”的登录失败,即使实际上是“ DOMAIN \ MACHINENAME $”,登录也会失败被授予连接权限。似乎对我来说是误导性的错误消息。
mivra

16

基本上要解决此问题,我们需要进行一些设置,例如

  • 在ApplicationPoolIdentity下运行的Web App
  • Web应用程序在连接字符串中使用Windows身份验证通过ADO.Net连接到数据库

使用Windows验证的连接字符串包含任何Trusted_Connection=Yes属性或属性等同Integrated Security=SSPIWeb.config文件

我的数据库连接处于Windows身份验证模式。因此,我通过将应用程序池标识从ApplicationPoolIdentity更改为我的域登录凭据DomainName \ MyloginId来解决了该问题

步:

  1. 单击应用程序池
  2. 选择您的应用程序名称

  3. 转到高级设置

  4. 展开流程模型,然后单击标识。单击右端的三个点。
  5. 单击设置...按钮并提供您的域登录凭据

对我来说,它已经解决了。

注意:在生产或IT环境中,您可能在同一域下具有用于应用程序池标识的服务帐户。如果是这样,请使用服务帐户而不是您的登录名。


对于上述问题,这应该是公认的答案。
makil

14

对我有用的技巧是Integrated Security从我的连接字符串中删除并User ID=userName; Password=passwordApp.config您的库中添加一个常规的连接字符串,可能不是使用集成安全性,而是在其中创建的安全性Web.config


3
十亿感谢您。巨大的巨大帮助。谢谢你,谢谢你,谢谢你。我敢肯定,这很明显,但对于将来的人们来说,这是用户ID =某些东西;密码=某物;
shubniggurath

2
我在帖子标题中遇到了同样的错误。我发现当数据库连接字符串中的“'trusted connection = true'”时,'User Id = yourUserid Password = yourPassword'被忽略。我从字符串中删除了“'trusted connection = true'”,从而解决了我的问题。直到我将应用程序从VS 2012中的调试迁移到iis 8时,这种情况才发生
。– T3.0

12

一位同事有相同的错误,这是由于IIS中的一些配置错误。
为Web应用程序分配了错误的应用程序池。

实际上,我们使用具有特定标识的自定义应用程序池来满足我们的需求。

在他的本地IIS管理器中->站点->默认网站->我们的Web应用程序名称->基本设置...应用程序池是“ DefaultAppPool”,而不是我们的自定义应用程序池。

设置正确的应用程序池解决了该问题。


11

我添加<identity impersonate="true" />到我的web.config,它工作正常。


7
只需了解这将改变ASP.NET应用程序整体运行的上下文。现在,它将在使用该应用程序的用户(即Domain \ someUser)的上下文中运行,而不是在默认的“ NETWORK SERVICE”上下文中运行。有时这是可以的,但是只要了解此更改不仅是对OP的快速修复,而且确实存在其他可能/可能不需要的下游含义。
atconway


6

对我来说,当我用允许访问数据库的网络帐户替换默认内置帐户“ ApplicationPoolIdentity”时,问题已解决。

可以在Internet Information Server(IIS 7+)>应用程序池>高级设置>进程模型>身份中进行设置


4

对我来说,通过将DefaultApplicationPoolIdentity 设置为,可以解决“ DOMAIN \ MACHINENAME $”问题NetworkService

在此处输入图片说明


3

在处理Analysis Services数据库时,我们一直收到类似的错误消息。原来,用于运行Analysis Services实例的用户名尚未添加到SQL Server的安全登录名中。

在SQL Server 2012中,默认情况下,SQL Server和Analysis Services被配置为以不同的用户身份运行。如果您使用默认值,请始终确保AS用户可以访问您的数据源!


1
我有同样的问题。来自SSAS的错误是相同的,但该帐户不是网络服务。该帐户实际上是:NT Service \ MSOLAP $ INSTANCENAME
cdonner


2

我通过SQL Server身份验证的用户也遇到此错误

我尝试了一些修复程序,但没有用。

我的解决方案是在Management Studio:属性/安全性下配置其“服务器身份验证模式”以允许SQL Server身份验证。


1

每个人似乎都忽略了的唯一一点是,您可能希望集成安全性= true。您可能使站点在池帐户下运行。这样就可以了,并且仍然可以使用原始用户凭据而不是池凭据来访问SQL Server。这称为约束委派。如果启用它并设置SPN,则窗口将转换池的凭据以及用户对最终服务的请求(SQL就是这样的一种服务)。您必须在网络服务器上注册服务SQL请求的一站式SQL Server。设置所有这些内容对于我来说很难在这里进行准确的描述。我花了很长时间自己完成这项工作。


0

我花了几个小时尝试解决此问题,终于知道了-SQL Server Browser已“停止”。解决方法是将其更改为“自动”模式:

如果已禁用,请转到“控制面板”->“管理工具”->“服务”,然后查找SQL Server代理。右键单击,然后选择“属性”。从“启动类型”下拉列表中,从“禁用”更改为“自动”。

从这里引用


0

我之前遇到过同样的问题,Persist Security Info=True从connectionstring 删除对我来说很有效。


0

当客户端重命名SQL Server时,我遇到了这个问题。将SQL Reporting Service配置为连接到旧服务器名称,他们还为该旧服务器名称创建了一个别名,该别名重定向到新服务器名称的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为“授予”。

允许的网络服务

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.