为啥 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
user
和 password
针对定义的 AD 域。
如果凭据有效,我会在会话中存储一个带有一些用户数据的简单对象并重定向到我的主页。
到目前为止一切顺利 - 使用该应用程序,用户可以删除文件和目录。这些操作始终是当前用户的performed under
和impersonation 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】:至少我找到了问题。
问题是,在某些情况下我调用了Impersonation
twice or more
。
所以我已经处于模拟状态并再次调用模拟代码......
在 Windows 10 之前,这不是问题,但似乎在之后..
【讨论】:
以上是关于为啥 System.IO.Directory.Delete(string,bool) 仅在 asp.net 站点模拟用户时将文件夹标记为已删除的主要内容,如果未能解决你的问题,请参考以下文章
为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?