2012-01-20 32 views
8

Bu oldukça basit bir sorun olmalı, ancak bir nedenden ötürü bunu işe yaramayacak gibi görünmüyor. Tüm yapmak istediğim, tüm kullanıcılara tam erişime izin vermek için belirli bir dizindeki izinleri belirlemektir. Şimdiye kadar verdiğim kod:C# - Windows 7'deki Tüm Kullanıcılar İçin Dizin İzinlerini Ayarlayın

System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(destinationDirectory); 
FileSystemAccessRule fsar = new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow); 
DirectorySecurity ds = null; 

    if (!di.Exists) 
    { 
     System.IO.Directory.CreateDirectory(destinationDirectory); 
    } 

ds = di.GetAccessControl(); 
ds.AddAccessRule(fsar); 

Hiçbir istisna atılmıyor, ancak hiçbir şey de yok. Kod çalıştırıldıktan sonra dizin izinlerini kontrol ettiğimde hiçbir değişiklik göremiyorum.

Herhangi bir fikrin var mı? peşin

sayesinde
Sonny

+0

Eğer UAC devre dışı yukarıdaki kodu çalıştırmayı denedin mi: Aşağıdaki kod yerine WellKnownSidType.BuiltinUsersSid kullanarak, her yerde çalışacak? – rkosegi

+1

@David - Derlenmiş exe'yi yönetici olarak çalıştırmayı denedim ve sonuçta fark yaratmıyor. –

+0

@rkosegi - Bunu nasıl yaparım? Visual Studio'da bir ayar mı? –

cevap

25

Ayrıca değişiklikleri uygulamak için SetAccessControl çağırmanız gerekir.

ds = di.GetAccessControl(); 
ds.AddAccessRule(fsar); 
di.SetAccessControl(ds); // nothing happens until you do this 

O here tartışıldığı gibi MSDN üzerinde örnekler şiddetle, ayrıntılı olarak eksik gibi görünüyor. Ben iyi davranır izleyici kitlesi elde bu makaleden kodu kesmek:

static bool SetAcl() 
{ 
    FileSystemRights Rights = (FileSystemRights)0; 
    Rights = FileSystemRights.FullControl; 

    // *** Add Access Rule to the actual directory itself 
    FileSystemAccessRule AccessRule = new FileSystemAccessRule("Users", Rights, 
           InheritanceFlags.None, 
           PropagationFlags.NoPropagateInherit, 
           AccessControlType.Allow); 

    DirectoryInfo Info = new DirectoryInfo(destinationDirectory); 
    DirectorySecurity Security = Info.GetAccessControl(AccessControlSections.Access); 

    bool Result = false; 
    Security.ModifyAccessRule(AccessControlModification.Set, AccessRule, out Result); 

    if (!Result) 
     return false; 

    // *** Always allow objects to inherit on a directory 
    InheritanceFlags iFlags = InheritanceFlags.ObjectInherit; 
    iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; 

    // *** Add Access rule for the inheritance 
    AccessRule = new FileSystemAccessRule("Users", Rights, 
           iFlags, 
           PropagationFlags.InheritOnly, 
           AccessControlType.Allow); 
    Result = false; 
    Security.ModifyAccessRule(AccessControlModification.Add, AccessRule, out Result); 

    if (!Result) 
     return false; 

    Info.SetAccessControl(Security); 

    return true; 
} 
+0

Teşekkürler David. Yine de hayır şans. Bu amaçla "Kullanıcılar" grubunu kullanmam doğru mu? Exe'yi yönetici olarak çalıştırmayı denedim ve hala Windows'a girip klasördeki izinleri kontrol ettiğimde hiçbir şey olmuyor gibi görünüyor. –

+2

Yaklaşıyor. "Kullanıcıların" "Herkes" olarak değiştirilmesi artık "Herkes" grubunu klasöre ekledi, ancak izinler boş görünüyor; hiçbir şey verilmedi. –

+0

Kod, "Kullanıcılar" ile bile benim için iyi çalışıyor. Yani, tam adı '@" BUILTIN \ Kullanıcılar "olduğunu düşünüyorum, ancak her iki şekilde çalışır. –

5

David Heffernan cevabı "Kullanıcılar" izinlerini ayarlamak çalışırken bir IdentityNotMapped durumla başarısız İngilizce olmayan bir makinede, çalışmıyor .

static void SetFullControlPermissionsToEveryone(string path) 
{ 
    const FileSystemRights rights = FileSystemRights.FullControl; 

    var allUsers = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null); 

    // Add Access Rule to the actual directory itself 
    var accessRule = new FileSystemAccessRule(
     allUsers, 
     rights, 
     InheritanceFlags.None, 
     PropagationFlags.NoPropagateInherit, 
     AccessControlType.Allow); 

    var info = new DirectoryInfo(path); 
    var security = info.GetAccessControl(AccessControlSections.Access); 

    bool result; 
    security.ModifyAccessRule(AccessControlModification.Set, accessRule, out result); 

    if (!result) 
    { 
     throw new InvalidOperationException("Failed to give full-control permission to all users for path " + path); 
    } 

    // add inheritance 
    var inheritedAccessRule = new FileSystemAccessRule(
     allUsers, 
     rights, 
     InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
     PropagationFlags.InheritOnly, 
     AccessControlType.Allow); 

    bool inheritedResult; 
    security.ModifyAccessRule(AccessControlModification.Add, inheritedAccessRule, out inheritedResult); 

    if (!inheritedResult) 
    { 
     throw new InvalidOperationException("Failed to give full-control permission inheritance to all users for " + path); 
    } 

    info.SetAccessControl(security); 
} 
+1

Çok teşekkür ederim, bana çok acı verdin. –

İlgili konular