为啥 System.IO.Directory.Delete(string,bool) 仅在 asp.net 站点模拟用户时将文件夹标记为已删除

Posted

技术标签:

【中文标题】为啥 System.IO.Directory.Delete(string,bool) 仅在 asp.net 站点模拟用户时将文件夹标记为已删除【英文标题】:Why System.IO.Directory.Delete(string,bool) only markes a folder as deleted, when a asp.net site impersonates a user为什么 System.IO.Directory.Delete(string,bool) 仅在 asp.net 站点模拟用户时将文件夹标记为已删除 【发布时间】:2015-10-13 11:51:00 【问题描述】:

我的asp.net 4.0 Application 有一个奇怪的行为,因为我已经更新到 Windows10(我认为它带有 10)。

我有一个在 IIS 中使用 BasicAuthentication 的应用程序 - 在我的 Login.aspx 中,我手动 verifying userpassword 针对定义的 AD 域。 如果凭据有效,我会在会话中存储一个带有一些用户数据的简单对象并重定向到我的主页。

到目前为止一切顺利 - 使用该应用程序,用户可以删除文件和目录。这些操作始终是当前用户的performed underimpersonation context

进入“模拟上下文”:(仅主要部分)

[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
public virtual void Enter(LogonType logonType = LogonType.LOGON32_LOGON_INTERACTIVE, LogonProvider provider = LogonProvider.LOGON32_PROVIDER_DEFAULT)
       
    token = IntPtr.Zero;

    //Create the token
    bool logonSuccessfull = GetToken(this.username, this.password, this.domain, ref token, logonType, provider);

    WindowsIdentity identity;
    identity = new WindowsIdentity(token);
    impContext = identity.Impersonate();                               

如果用户删除目录:

Public void Delete(string directory)

    //1. Entering impersonation context before (context.Enter();)

    //2. Delete the file (executing this basic .net method):
      System.IO.Directory.Delete(directory, true);

    //3. Leaving the impersonation context after (context.Leave() -> .Undo();)

在资源管理器中以管理员身份操作i can still see the directory(之前已关闭)。但如果我想打开文件夹,我会收到access denied 消息。我也是not able to 监视目录的权限或become the owner 这个“幽灵文件夹”。快速的文件系统检查也没有帮助。

但是:如果applicationpool ends - 文件夹消失了...

Applicationpool 是一个Classic .net 4.0 Pool 和Network-Identity(此时更改此设置并未解决问题)

有人知道为什么不立即删除它们吗? 以及如何强制?

【问题讨论】:

【参考方案1】:

至少我找到了问题。 问题是,在某些情况下我调用了Impersonationtwice or more。 所以我已经处于模拟状态并再次调用模拟代码...... 在 Windows 10 之前,这不是问题,但似乎在之后..

【讨论】:

以上是关于为啥 System.IO.Directory.Delete(string,bool) 仅在 asp.net 站点模拟用户时将文件夹标记为已删除的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?