DirectoryEntry IIS访问权限

时间:2013-01-15 22:31:18

标签: c# windows security iis iis-8

我有一个控制台应用程序,它列出了IIS中的网站绑定

using (var directoryEntry = new DirectoryEntry("IIS://localhost/w3svc/" + GetWebSiteId())) {
    var bindings = directoryEntry.Properties["ServerBindings"]; 
}

我通过进程

从ASP.NET调用此控制台应用程序
var process = new Process {
   StartInfo = new ProcessStartInfo {
       FileName = "c:/app.exe",
       Arguments = "check",
       UseShellExecute = false,
       RedirectStandardOutput = true,
       CreateNoWindow = true
    }
};

在Widows 7 / IIS 7.5下的开发机器上一切正常,但是当我在Windows 2012 / IIS 8上测试时,我得到“访问被拒绝”错误。

错误日志

"System.Runtime.InteropServices.COMException (0x80070005): Access is denied.
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_IsContainer()
at System.DirectoryServices.DirectoryEntries.ChildEnumerator..ctor(DirectoryEntry container)
at System.DirectoryServices.DirectoryEntries.GetEnumerator()
at IISSubdomainManagement.Program.GetWebSiteId()
at IISSubdomainManagement.Program.TotalBindings()
at IISSubdomainManagement.Program.Main(String[] args)"

p.s应用程序池标识是“ApplicationPoolIdentity”


我忘了提一下,当我从CMD运行它时,我的控制台应用程序在我的服务器上正常工作

4 个答案:

答案 0 :(得分:2)

您需要授权IUSR帐户访问并执行C:\app.exeThis link应该为您提供必要的信息,以便找到合适的帐户。

答案 1 :(得分:1)

您可能已授予“ApplicationPoolIdentity”权限,而非授予与该应用程序池实际对应的虚拟帐户。阅读Microsoft's description或在线搜索虚拟身份IIS等。

在您的开发计算机上,您可能拥有某种完全管理员权限,因此它不受限制。

如果之后仍有问题,我建议您使用Process Monitor运行来复制错误,这样您就可以确切地看到哪个进程正在访问哪个资源具有哪个标识。但是,我建议在开发计算机上复制该问题,而不是在生产中运行Process Monitor。能够有效地运行它需要一点点学习。

答案 2 :(得分:1)

在IIS 7/8中,打开或关闭控制面板 /程序和功能/打开或关闭Windows功能,以及检查所有项目:Web管理工具,(包括:IIS管理服务,II 6管理兼容性)

答案 3 :(得分:0)