2011-03-09 17 views
8

Aşağıdaki durumun üstesinden gelmeye çalışıyorum.'Kırık' izinlere sahip dosyaların sahiplenilmesi

Verilen bir NTFS birimindeki, saklanan bir dizin:

  1. dizin sahibi başkası (örneğin olmayan bir ayrıcalıklı kullanıcı) DACL erişime izin şekilde yapılandırılır
  2. dizin olarak ayarlanır dizin sistemi veya Yöneticiler
  3. DACL içermez insanların belirli bir grup aslında DACL'yi
sahipliğini almak veya değiştirmek ya kimse erişim izni(veya kısaca, tüm yöneticiler klasörün dışına kilitlendi)

Ama!

  1. ben altında çalıştırıyorum hesap, ben diğer araçları (takeown.exe) kullanarak yine
  2. yenisini yazıyorum olarak
  3. mevcut dacl göz ardı edilebilir yönetici haklarına (SeBackupPrivilege, SeSecurityPrivilege) vardır ben söz konusu dizine erişebilir.

(veya kısaca ben DACL'yi/sahibi düzeltmek için erişebilir) Aşağıdaki kod ile hiçbir sorun olmalı

:

WindowsIdentity privilegedUser = System.Security.Principal.WindowsIdentity.GetCurrent(); 

// I cannot use File.GetAccessControl() as I get access denied 
// (working as intended! I have no access to read the ACL!) 
// so I have to write a new ACL: 
FileSecurity acl = new FileSecurity(); 
acl.SetOwner(admin.User); 
acl.AddAccessRule(new FileSystemAccessRule(privilegedUser.User, FileSystemRights.FullControl, AccessControlType.Allow)); 

File.SetAccessControl("c:\\path\\to\\broken", acl); 

Ama SetAccessControl çağrı atar UnauthorizedAccessException. Sadece sahibi ayarlamak için değiştirdiğimde, aynı şey olur. Sadece DACL'yi ayarlamaya çalıştığımda aynı şey.

İşlem Gezgini'nde sonuç işlemlerini denetleyerek sorunun UAC olmadığını doğruladı ve Yöneticiler grubunun "Devre Dışı" yerine "Sahip" olarak ayarlandığını doğruladı. I 'un bunu yapması için gereken tüm haklara sahip olması gerekir (Yedekleme Yöneticileri, Yöneticiler karşısında karşıdan gelmemelidir, ancak bunu test için ekledim) - ancak erişim engelleniyor.

İlgili technet belgeleri: http://technet.microsoft.com/en-us/library/cc783530%28WS.10%29.aspx

  • "Bir nesne sahibiyseniz, sahipliğini almak için izin dahil olmak üzere bu nesne üzerinde herhangi bir kullanıcı veya güvenlik grubunu daha izni verebilir."
  • Sahipliği aşağıdaki şekillerde aktarılabilir:
    • şimdiki sahibi o kullanıcı istediği zaman sahipliğini almak için izin başka bir kullanıcıya alın sahiplik izni verebilir. Kullanıcının aktarımı tamamlamak için sahipliğini alması gerekir. (Maalesef, sahip bu durumun sahipliğini yeniden atayamaz.)
    • Bir yönetici, sahipliğini alabilir.
    • Dosyaları ve dizinleri geri yükleme hakkına sahip olan bir kullanıcı, sahipliğini herhangi bir kullanıcıya veya gruba atayabilir.
  • Dosyaların ve diğer nesnelerin sahipliğini alma yeteneği, bir yöneticinin sistemi koruma gereksiniminin, bir sahibin erişimi denetleme hakkının önceliği üzerinde olduğu başka bir durumdur. Normalde, bir nesnenin sahipliğini yalnızca mevcut sahibi size izin verdiyse verir. NTFS nesnelerinin sahipleri, diğer kullanıcının Sahip Olma izni izni vererek başka bir kullanıcının sahipliğini almasına izin verebilir; Active Directory nesnelerinin sahipleri başka bir kullanıcı Sahibi Yetkisini değiştirebilir. Bu ayrıcalığa sahip bir kullanıcı, mevcut sahibin izni olmadan bir nesnenin sahipliğini alabilir. Varsayılan olarak, ayrıcalık yalnızca yerleşik Yöneticiler grubuna atanır. Normalde, yöneticiler, mevcut sahipleri artık mevcut olmadığında, kaynakların sahipliğini alması ve yeniden ataması için kullanılır.

Burada nelerin eksik?

+0

Tam olarak aynı sorundan. Buna bir çözüm bulmayı başardın mı? – Maverik

+0

Ayrıca bkz. Http://stackoverflow.com/questions/5368825/taking-ownership-of-a-file-or-folder ve http://stackoverflow.com/questions/153087/getting-setting-file-owner-in -c-keskin –

cevap

6

ve sadece burada yayınlamayı deneyin bu

using (var user = WindowsIdentity.GetCurrent()) 
{ 
    var ownerSecurity = new DirectorySecurity(); 
    ownerSecurity.SetOwner(user.User); 
    Directory.SetAccessControl("c:\\path\\to\\broken", ownerSecurity); 

    var accessSecurity = new DirectorySecurity(); 
    accessSecurity.AddAccessRule(new FileSystemAccessRule(user.User, FileSystemRights.FullControl, AccessControlType.Allow)); 
    Directory.SetAccessControl("c:\\path\\to\\broken", accessSecurity); 
} 

gerekecektir Buraya gelip benim gibi arama yapan başkaları için:

Kodda SeTakeOwnershipPrivilege öğesini açıkça etkinleştirmeniz gerekir. Bu tür bir şeyle ilgilenmek için Process Privileges'u buldum. İşte

benim kodunu (i yetkisine sahip olsa da, süreç ı açıkça izin vermez sürece nedense gibi görünüyor) sabit nasıl:

using (new ProcessPrivileges.PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.TakeOwnership)) 
{ 
    directoryInfo = new DirectoryInfo(path); 
    directorySecurity = directoryInfo.GetAccessControl(); 

    directorySecurity.SetOwner(WindowsIdentity.GetCurrent().User); 
    Directory.SetAccessControl(path, directorySecurity);  
} 

PS: Teşekkürler Simon .. senin Cevap bana başlamak için bir yer verdi.

+0

Bu gerçekten benim sorunumdu! İyi ol UAC. Ve evet, başka bir şey olmasaydı, marş için Simon'a teşekkürler. –

+1

Bu problemi yaşadım ve UAC'ım bile yoktu ... ama bu işe yaradı! – emfurry

+1

UAC ile ilgisi yok. İmtiyazlar, UAC'nin yürürlüğe girmesinden çok önce bu şekilde çalıştı; Onları kullanmak istiyorsanız, önce onları etkinleştirmelisiniz. (Muhtemelen programlayıcının yanlışlıkla ayrıcalıklardan faydalanamaması için). –

5

Erişim eklemeden önce sahiplik almanız gerekir. Eğer DirectorySecurity ayarlarken eğer işe yaramazsa Ayrıca

using (var user = WindowsIdentity.GetCurrent()) 
{ 
    var ownerSecurity = new FileSecurity(); 
    ownerSecurity.SetOwner(user.User); 
    File.SetAccessControl("c:\\path\\to\\broken", ownerSecurity); 

    var accessSecurity = new FileSecurity(); 
    accessSecurity.AddAccessRule(new FileSystemAccessRule(user.User, FileSystemRights.FullControl, AccessControlType.Allow)); 
    File.SetAccessControl("c:\\path\\to\\broken", accessSecurity); 
} 

bu

http://blog.mikeobrien.net/2009/11/taking-ownership-and-setting-admin.html

Aynı sorun vardı
+0

Teşekkürler, Simon. Bir süredir bununla uğraşıyordum. Yaptığımma memnun olduğum Mark'ın MSDN makalesini okudum, ama günü kurtarmış olan mesajındı. –

+0

Mike O'Briens blogundaki kod benim için mükemmel çalıştı. – David

İlgili konular