C# 使用托管服务帐户将文件从IIS写入网络驱动器

C# 使用托管服务帐户将文件从IIS写入网络驱动器,c#,asp.net-mvc,permissions,impersonation,C#,Asp.net Mvc,Permissions,Impersonation,我有一个ASP.NET MVC 5应用程序托管在Windows 2016的IIS 10中。我们的系统管理员已创建一个托管服务帐户(MSA),该帐户绑定到此服务器,并具有对网络上某个文件夹的读/写权限。我需要使用MSA将PDF从web应用程序写入该文件夹 目前,我只是尝试将一个简单的文本文件写入文件夹: System.IO.File.WriteAllText(@"\\SomeUncPath\Reports\test.txt", "sample text"); 上述情况会产生预期的错误 Syste

我有一个ASP.NET MVC 5应用程序托管在Windows 2016的IIS 10中。我们的系统管理员已创建一个托管服务帐户(MSA),该帐户绑定到此服务器,并具有对网络上某个文件夹的读/写权限。我需要使用MSA将PDF从web应用程序写入该文件夹

目前,我只是尝试将一个简单的文本文件写入文件夹:

System.IO.File.WriteAllText(@"\\SomeUncPath\Reports\test.txt", "sample text");
上述情况会产生预期的错误

System.UnauthorizedAccessException:对路径“\SomeUncPath\Reports\test.txt”的访问被拒绝

我看了这个视频:没用。它只是导致站点生成503错误

是否可以使用C#模拟来编写文件,如中所述?但是,如何模拟MSA,它具有由系统设置的密码

我尝试使用以下代码:

上面提到:

System.ArgumentException:密码不能为空或仅由空白字符组成。参数名称:密码

更新1:服务器将以下错误抛出到系统日志中:

应用程序池SomePool已被禁用。Windows Process Activation Service(WAS)在启动为应用程序池提供服务的工作进程时遇到故障

这两个警告是:

应用程序池SomePool已被禁用。Windows Process Activation Service(WAS)未创建为应用程序池提供服务的工作进程,因为应用程序池标识无效

应用程序池SomePool的标识无效。为标识指定的用户名或密码可能不正确,或者该用户可能没有批量登录权限。如果未更正标识,则当应用程序池收到其第一个请求时,应用程序池将被禁用。如果批登录权限导致问题,则在授予权限后,必须更改IIS配置存储中的标识,然后Windows Process Activation Service(WAS)才能重试登录。如果在处理应用程序池的第一个请求后标识仍然无效,则应用程序池将被禁用。数据字段包含错误号

我尝试并重新启动了服务器,但问题仍然存在

更新2:如果我向应用程序池提供凭据,则应用程序加载时不会出现任何问题。只有MSA出现上述错误/警告时才会失败。MSA有什么问题


更新3:问题在于我如何将MSA添加到应用程序池中。我需要在用户名中包含我的域:
myDomain\someMsa$
。一旦我有了它,它就像一个符咒

问题与将MSA设置为应用程序池标识时缺少域有关。添加它时,我需要将其设置为
myDomain\someMsa$
,而不是简单的
someMsa$
。奇怪的是IIS没有给出错误,可能是因为MSA帐户同时被视为本地帐户和域帐户


此外,在我们的例子中,MSA不需要“批量登录”权限。没有它,它工作得很好

错误似乎很清楚-您没有给
SomePool
MSA提供正确的密码。谢谢,@NetMage。发现问题:将MSA作为其标识添加到应用程序池时,我没有添加“myDomain”。一旦它出现了,它就很高兴。与其将你的解决方案作为更新发布,不如将其作为答案发布并接受。谢谢,@LexLi。我回到办公室后再回答。
var cred = new UserCredentials("myDomain", "someMsa$", "");
Impersonation.RunAsUser(cred, LogonType.Batch, () =>
    {
        System.IO.File.WriteAllText(@"\\SomeUncPath\Reports", "sample text");
    }
);