Lee*_*aks 8 asp.net iis iis-7 iis-6 active-directory
我在使用ADSI查询IIS元数据库的网页中运行一段代码.代码就像这样简单:
DirectoryEntry iisNode =
new DirectoryEntry("/LM/W3SVC/1/ROOT/MyAspWebsite-1-128886021498831845");
foreach (DirectoryEntry de in iisNode.Parent.Children)
{
System.Console.WriteLine(de.Name);
}
Run Code Online (Sandbox Code Playgroud)
当我在IIS7/W2K8上的DefaultAppPool下运行页面/站点时,这可以正常工作.但是,当我创建自己的应用程序池并使属性与默认应用程序池相同时,此代码将失败,并显示以下错误:
Caught: System.Runtime.InteropServices.COMException
Failed to parse virtual directory:
/LM/W3SVC/1/ROOT/MyAspWebsite-1-128889542757187500
System.Runtime.InteropServices.COMException (0x80070005): Access is denied.
Run Code Online (Sandbox Code Playgroud)
DefaultAppPool有哪些特权?我没有看到任何记录.我需要这个在非默认应用程序池中工作,但不给整个工作进程提升权限.我还尝试使用DirectoryEntry构造函数的用户名和密码参数,通过在运行IIS7的机器上使用Admin,但这并没有改变任何东西.我还要注意,这在IIS6和W2K3上运行良好.
任何帮助表示赞赏.
您可能没有意识到,运行代码的实际身份可能与进程资源管理器中为 w3wp.exe 列出的身份不同。您应该设置断点或WindowsIdentity.GetCurrent().Name在引发 COMException /“访问被拒绝”违规的违规代码行 (DirectoryEntry.Parent.Children) 附近运行。
例如,对于我来说,我的应用程序池进程 w3wp.exe 正在NETWORK SERVICE任务管理器窗口中运行,正如您上面所描述的那样。然而,当我检查实际的运行时身份时,发现它是新的 IIS7 内置用户IUSR,这与我在 IIS6 中获得的值不同,即NETWORK SERVICE。
using System.Security.Principal;
Console.WriteLine(
WindowsIdentity.GetCurrent().Name); // IUSR on IIS7, NETWORKSERVICE on IIS6
foreach (var de in DirectoryEntry("/LM/W3SVC/1/ROOT/MySite".Parent.Children))
{
System.Console.WriteLine(de.Name);
}
Run Code Online (Sandbox Code Playgroud)
看来在 IIS6 中,NETWORK SERVICE 有权通过该类的 Active Directory 服务接口 ( ADSI )探索IIS 元数据库。然而,IIS7 中的新 IUSR 标识却不然。为了运行上述代码,您必须直接模拟具有现有 ADSI 读取权限的帐户,例如:DirectoryEntry
using (new MyImpersonationWrapper("admin","pass"))
{
foreach (var de in DirectoryEntry("/LM/W3SVC/1/ROOT/MySite".Parent.Children))
{
System.Console.WriteLine(de.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
实现您自己的模拟包装并确保正确的本地帐户是我留给您的一项练习,因为您的(安全)需求可能会有所不同。
或者,您应该能够使用IIS7 的 WMI 提供程序来查找所需的信息,如此MSDN 博客文章中所建议的那样。
| 归档时间: |
|
| 查看次数: |
5241 次 |
| 最近记录: |