Paylaşılan dizin iznini kontrol etmek için bir kod yazmak istiyorum, birden fazla çözüm denetlerim ancak yerel dizin iznini almaya çalışırken iyi çalışır, ancak paylaşılan dizinler için test durumları oluşturduğumda başarısız olur. SOF: checking-for-directory-and-file-write-permissions-in-netPaylaşılan dizin izni için denetleniyor - C#
ancak yalnızca yerel dizinleri çalışır:
bu soruların örnekleri çalışıyor.
public class CurrentUserSecurity
{
WindowsIdentity _currentUser;
WindowsPrincipal _currentPrincipal;
public CurrentUserSecurity()
{
_currentUser = WindowsIdentity.GetCurrent();
_currentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
}
public bool HasAccess(DirectoryInfo directory, FileSystemRights right)
{
// Get the collection of authorization rules that apply to the directory.
AuthorizationRuleCollection acl = directory.GetAccessControl()
.GetAccessRules(true, true, typeof(SecurityIdentifier));
return HasFileOrDirectoryAccess(right, acl);
}
public bool HasAccess(FileInfo file, FileSystemRights right)
{
// Get the collection of authorization rules that apply to the file.
AuthorizationRuleCollection acl = file.GetAccessControl()
.GetAccessRules(true, true, typeof(SecurityIdentifier));
return HasFileOrDirectoryAccess(right, acl);
}
private bool HasFileOrDirectoryAccess(FileSystemRights right,
AuthorizationRuleCollection acl)
{
bool allow = false;
bool inheritedAllow = false;
bool inheritedDeny = false;
for (int i = 0; i < acl.Count; i++)
{
FileSystemAccessRule currentRule = (FileSystemAccessRule)acl[i];
// If the current rule applies to the current user.
if (_currentUser.User.Equals(currentRule.IdentityReference) ||
_currentPrincipal.IsInRole(
(SecurityIdentifier)currentRule.IdentityReference))
{
if (currentRule.AccessControlType.Equals(AccessControlType.Deny))
{
if ((currentRule.FileSystemRights & right) == right)
{
if (currentRule.IsInherited)
{
inheritedDeny = true;
}
else
{ // Non inherited "deny" takes overall precedence.
return false;
}
}
}
else if (currentRule.AccessControlType
.Equals(AccessControlType.Allow))
{
if ((currentRule.FileSystemRights & right) == right)
{
if (currentRule.IsInherited)
{
inheritedAllow = true;
}
else
{
allow = true;
}
}
}
}
}
if (allow)
{ // Non inherited "allow" takes precedence over inherited rules.
return true;
}
return inheritedAllow && !inheritedDeny;
}
}
Bu dizin veya dosya üzerinde geçerli bürünme iznini kontrol edin:
Örneğin, ben bu sınıfı kullanılır. Tüm sınama vakaları yerel dizini denetlerken doğru bir şekilde geçer, ancak bazıları çözmek istediğim sorun olan paylaşılan dizinde başarısız olur, bunun için herhangi bir çözüm var mı?
[TestMethod]
public void HasAccess_NotHaveAccess_ReturnsFalse()
{
CurrentUserSecurity cus = new CurrentUserSecurity();
bool result = cus.HasAccess(new DirectoryInfo(@"\\sharedpc\readonly"), System.Security.AccessControl.FileSystemRights.Write);
Assert.AreEqual(result, false);
}
Merhaba yamaca, Kodunuzu denedim ve her şey yolunda çalışıyor. Geçerli kullanıcı için "\\ sharedpc \ readonly" klasöründe izinleri uygun şekilde ayarladığınızdan emin misiniz? –
Merhaba, aşağıda bir cevap koydum ama bunun bir çevre meselesi olduğunu veya birazcık karışıklık olduğunu düşünün. TestMethod'unuzun True döndürdüğünü, * kullanıcının * izin verdiğini, ancak bu * yanlış * olduğunu anlıyorum. 1. Sorunuzu [değiştirebilir] ve klasör izinlerinin ekran görüntüsünü sağlayabilir ve 2. WindowsIdentity.GetCurrent' kodunu çalıştıran kullanıcı hesabı adını gösterebilir. 3. Kendinizin yanında farklı bir WindowIdentity ile test ettiğinizi onaylayın. Bunu yapmak için en kolay yol http://stackoverflow.com/questions/125341/how-do-you-do-impersonation-in-net/7250145#7250145 Teşekkürler . –
Bunu denediniz mi, https://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesystemsecurity.accessrulefactory(v=vs.110).aspx? Yöntem, iç içe geçmiş kuralları veya gruba vb. Uygulanan kural gibi bağımlı kuralları çözmeyebilir, bu yöntem size doğrulamak için gerçek erişim kuralı verebilir. –