【发布时间】:2019-05-15 22:26:57
【问题描述】:
我有一个托管在 Windows 2016 上的 IIS 10 中的 ASP.NET MVC 5 应用程序。我们的系统管理员创建了一个托管服务帐户 (MSA),该帐户与此服务器相关联,并且对网络上的文件夹具有读/写权限.我需要使用 MSA 从 Web 应用程序将 PDF 写入该文件夹。
目前,我只是想将一个简单的文本文件写入文件夹:
System.IO.File.WriteAllText(@"\\SomeUncPath\Reports\test.txt", "sample text");
上面会产生这个错误,这是意料之中的,
System.UnauthorizedAccessException:对路径“\SomeUncPath\Reports\test.txt”的访问被拒绝。
我关注了这个视频:https://www.youtube.com/watch?v=lBv81lwZgIo 无济于事。它只是导致网站生成 503 错误。
是否可以使用 C# 模拟来编写文件,例如 this article 中所述?但是,您如何模拟 MSA,其密码由系统设置?
我使用SimpleImpersonation 尝试了以下代码:
var cred = new UserCredentials("myDomain", "someMsa$", "");
Impersonation.RunAsUser(cred, LogonType.Batch, () =>
{
System.IO.File.WriteAllText(@"\\SomeUncPath\Reports", "sample text");
}
);
上面抛出这个:
System.ArgumentException:密码不能为空或仅由空格字符组成。参数名称:密码
更新 1: 服务器将以下错误抛出到系统日志中:
应用程序池 SomePool 已被禁用。 Windows Process Activation Service (WAS) 在启动工作进程为应用程序池提供服务时遇到故障。
还有这两个警告:
应用程序池 SomePool 已被禁用。 Windows Process Activation Service (WAS) 未创建工作进程来为应用程序池提供服务,因为应用程序池标识无效。
和
应用程序池 SomePool 的标识无效。为标识指定的用户名或密码可能不正确,或者用户可能没有批量登录权限。如果没有更正身份,当应用程序池收到第一个请求时,应用程序池将被禁用。如果批处理登录权限导致问题,则必须在授予权限后更改 IIS 配置存储中的标识,然后 Windows Process Activation Service (WAS) 才能重试登录。如果在处理应用程序池的第一个请求后身份仍然无效,则应用程序池将被禁用。数据字段包含错误号。
我尝试了this 并重新启动了服务器,但问题仍然存在。
更新 2:如果我向应用程序池提供我的凭据,则应用程序加载时不会出现任何问题。只有在 MSA 上才会出现上述错误/警告。 MSA 有什么问题?
更新 3: 问题在于我如何将 MSA 添加到应用程序池中。我需要在用户名中包含我的域:myDomain\someMsa$。一旦我把它放进去,它就像一个魅力!
【问题讨论】:
-
错误似乎很明显 - 您没有为
SomePool提供 MSA 的正确密码。 -
谢谢,@NetMage。发现问题:将 MSA 作为其身份添加到应用程序池时,我没有添加“myDomain”。一旦它在那里,它就很高兴。
-
不要将您的解决方案作为更新发布,而是将其作为答案发布并接受。
-
谢谢,@LexLi。回到办公室我会回答的。
标签: c# asp.net-mvc permissions impersonation