13 Haziran 2008 Cuma

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

Bu hataya, yakalanmayan yoktur sanırım, özellikle
Doc Lib'ler üzerinde yetki seviyesi düşük kullanıcaların login olduğu portal üzerinde bir item güncelleme,silme yada kendi yetkisini aşan işlemlerde "
Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))" hatasını alırız. Bu bence çok can sıkıcı bir durum. Bu problemin çözümü için hemen aklınıza
SPSecurity.RunWithElevatedPrivileges
methodu gelebilir, ancak buna o kadar güvenmeyin. Çünkü karşılaştığım problem üzerinde hiçbir faydası olmadı.
Problem şuydu:


Birkaç zorunlu alana sahip Document Library listemde upload yaptığımda, upload işleminden sonra çıkan edit ekranında zorunlu alanları doldurmadan cancel işlemi yaptığımızda upload yapılan dosya Check-Out olarak listede duruyor. İlginç olan bir konu da bu check-out olarak kalan item'ın
admin haklarına sahip kullanıcalar tarafından da görülemiyor olması. Yazdım custom bir yapı ile cancel dediği anda callback methodu çağırıp silme işlemini gerçekleştiriyorum. Ancak siz bu silme işlemlerini
SPSecurity.RunWithElevatedPrivileges ile yapsanız bile item görülemediği için silinemiyor çünkü item yok :), (ha siz bu şekilde silebilirseniz bana da söyleyin ancak yukarda yazdığım işlemler seviyesinde).


Çözüm için:


ImpersonationUtility
 imp = 
ImpersonationUtility
.ImpersonateAdmin();
 kodunu kullanıp, yetkileri olmayan kullanıcı yerine admin haklarına sahip olan kullanıcı ile işlemleri yaptırıyorum, ancak yukarda ifade ettiğim gibi admin olsa bile cancel işleminden sonraki check-out olan item'ın görülmediğinden (ki sadece onu oluşturan user görebiliyor ve kod ile erişebiliyor), admin hakları ile listenin rollerini değiştirip geçici olarak üzerindeki hakları silip(daha sonra silme işlemi tamamlanınca bu hakları geri vermek üzere bunları bir generic list içerisinde tutuyorum) bu kullanıcıya item silme hakkını veriyorum. Silme işlemini gerçekleştiriyorum ve generic listemdeki hakları tekrar geri veriyorum ve mutlu son böylece item silinebiliyor.







Hiç yorum yok: