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.







2 Haziran 2008 Pazartesi

Retaining Attachment functionality when using the Custom List Form control in SharePoint 2007 or WSS 3.0

(Kaynak: Marc Davis' Blog)

Sharepoint ile oluşturduğumuz Custom List Formlarda(Insert->Sharepoint Controls->Custom List Form) en büyük problemimiz attachment desteği olmamasıdır. Bir dosya attach etmek istediğimizde "This form was customized not working with attachement." hata mesajını alırız. Sorun, custom list form oluştuğunda attachment için gereken upload kontrolü ve html yapısı oluşmaması. Bu mesaj'ın kaynağı "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS\1033\FORM.js" javascript dosyasıdır. Hata mesajını burada arattığımızda

function ShowPartAttachment()
{
if (document.getElementById("part1")==null ||
typeof(document.getElementById("part1"))=="undefined")
{
var L_FormMissingPart1_Text= "This form was customized not working with attachement.";
alert(L_FormMissingPart1_Text);
return;
}
document.getElementById("part1").style.display="none";
document.getElementById("partAttachment").style.display="block";
GetAttachElement(FileuploadString+FileUploadIndex).focus();
}


karşımıza javacript fonksiyonu çıkar. Burada "part1" id'sine sahip html objesi aranmakta ancak bulunamadığı için de hata uyarısı gelmektedir. Bazı forumlarda bu ID'ye sahip bir "span" oluşturulup sayfadaki orjinal webpart içeri alındığında ve webpartın içine de Sharepoint attachment kontrolü konduğunda çözülebileceği söyleniyor ancak olmuyor bu sadece client tarafta çalışıyor ancak herhangi bir attachment gerçekleşmiyor.
Bu problemi, bir çoğumuz kendi custom çalışmalarımız ile birşekilde çözmeye çalışırız. Bazı forumlarda da buna benzer örnekleri görmek mümkün. Örneğin kendim de bir çözüm buldum taki newform.aspx karşıma bir problem çıkartana kadar. Yazdığım bir webpart ile attachmet için gereken tabloyu oluşturup, newform.aspx içerisinde de bu html yapıyı tutacak bir Literal kontrolü kullandım. Webpartı da id'i "part1" olan bir span içerisine aldım, span tagını kapattıktan sonra da attachment için html kodlarını koydum (bunları custom olmayan bir listenin sayfanın kaynak kodlarına baktığımızda görürüz, IEDeveloper Toolbar ile de bu id'yi arattığınızda bulacaksınız, default'ta gözükmez (display=none),display değerini block yaptığınızda gözükecektir.) Beni terleten sorun, newform.aspx' henüz herhangi bir liste Item'ı oluşmaması. Bunun dışında tüm fonksiyonlar gayet iyi çalışıyordu. Ancak bu sorunu aşamadım.
Çözüm olarak en son yukarda kaynak olarak belirttiğim adreste mevcut, ne yapılması gerektiği adım adım açıklanmış. Uyguladım bizzat, çalışıyor. Bu konuda yardıma ihtiyacınız olursa, adresim (masallah.ozen@hotmail.com).

Ha bide dosya attach ederken web.config dosyanızaki maximum değeri baz alın, yada bu değeri arttırın,