我在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进程激活服务(WAS)在启动工作进程为应用程序池提供服务时遇到故障。
以及以下两个警告:
应用程序池SomePool已被禁用。 Windows进程激活服务(WAS)未创建工作进程来为应用程序池提供服务,因为应用程序池标识无效。
和
应用程序池SomePool的标识无效。为该身份指定的用户名或密码可能不正确,或者该用户可能没有批量登录权限。如果标识不正确,则当应用程序池收到其第一个请求时,将禁用该应用程序池。如果批处理登录权限引起了问题,则必须在授予权限后更改IIS配置存储中的标识,然后Windows Process Activation Service(WAS)才能重试登录。如果在处理对应用程序池的第一个请求之后身份仍然无效,则将禁用该应用程序池。数据字段包含错误号。
我尝试了this并重新启动了服务器,但问题仍然存在。
更新2:如果我为应用程序池提供凭据,则该应用程序加载不会有任何问题。它仅在MSA上失败,并出现上述错误/警告。 MSA可能有什么问题?
更新3:问题是我如何将MSA添加到应用程序池中。我需要在用户名
myDomain\someMsa$
中包含我的域。一旦有了它,它就像一个魅力! 最佳答案
问题与将MSA设置为应用程序池标识时缺少域有关。添加时,我需要将其设置为myDomain\someMsa$
而不是简单的someMsa$
。奇怪的是IIS没有给出错误,可能是因为MSA帐户被视为本地帐户和域帐户。
同样,在我们的情况下,我们不需要MSA的“批量登录”权限。没有它,它工作正常。
关于c# - 使用托管服务帐户将文件从IIS写入网络驱动器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53783296/