2011-04-20 21 views
5

Programım belirli bir UNC yoluna erişmeyi gerektirir, ancak yol alanlar arasıdır, bu nedenle programın çalıştırıldığı makineye bağlı olarak, varsayılan kimlik bilgileri olabilir veya olmayabilir. Normalde, bir kullanıcı sadece explorer'ı açmalı ve bir oturum açma istemi almak için UNC veya IP adresini girmelidir (bu noktada paylaşımın yapıldığı alan için uygun kimlik bilgilerini girebilirler).UNC Yolu'nun "Erişilebilirlik" Özelliğini Test Etme

UNC erişilebilirliğini sınamak için "temiz" bir yol var mı, ve varsayılan Windows kimlik bilgileri bozuksa, bunları farklı olanlardan isteyin mi?

Şu anda, paylaşımdaki bir metin dosyasını okumayı denemek, bir IOException yakalamak ve sonra "explorer.exe" Process nesnesini (gizli) açmak için oturum açma komutunu almak için bazı kötü kod kullanıyorum. Hepsi 10'lardan sonra tekrar kontrol eden bir döngü içinde yer alıyor. Bu tür işler, ama çözüm ve mantık gerçekten istenmeyen görünüyor.

Tek tercihlerim gerçekten WNetUseConnection veya birlikte çalışabilir bir çözüm mü?

cevap

3

Kontrol bu makalelerin:

  • Testing File Access Rights in .NET 2.0. Dosya sistemi izinlerini test etmek için kullanışlı bir sınıf.
  • Vexing exceptions. Eric Lippert neden önleyici testin anlamsız olduğunu (kısaca: örtülü bir yarış durumu var. Test ile gerçek erişim arasında, başka bir süreç izinleri değiştirebilir, dosyayı taşıyabilir veya silebilir veya ağ düşebilir ... Bu, kaynağa erişmeye çalıştığınızda atılan istisnalarla başa çıkmak zorunda olduğunuz anlamına gelir, bu nedenle, gerçekten de gerçekleştiğinde sorunla başa çıkmak için kodunuzu yapılandırabilirsiniz.

Bu: gerekiyordu

new FileIOPermission(FileIOPermissionAccess.Read, path).Demand(); 

,istenen erişime yoksa bir SecurityException atmak, ancak ağ sürücüleri veya UNC yollarında yolları için içinyönteminin bir op değil gibi görünüyor.

+0

Her zaman önleyici testin * anlamsız * olması şart değildir. Bazen zamanın önünde test yapmak, örneğin bir performans galibi olabilir. Yani, "hey, bir istisna atmak için son derece muhtemeldir?" Diye sormak daha ucuz olabilir. denemek ve istisna için beklemek. Bu, özellikle son adımda tüm şeyin başarısız olabileceği uzun, çok aşamalı süreçlerde geçerlidir. Son adımın neredeyse kesin olarak başarısız olması durumunda, zamanın dışına çıkmak sizi oraya götürme işini kurtarabilir. Ama, dedi ki, evet, başarısızlık durumunun üstesinden gelmek zorunda kalacaksın. –

+0

Evet ... 'anlamsız' muhtemelen en iyi ifade değil. Eğer dosyanın zaten mevcut olmadığını/ön tarafa erişilemediğini biliyorsanız, hemen hemen kesinlikle boşa gidecek çok iş yapmaktan ziyade kefalet etmek isteyebilirsiniz. –

+0

Tek endişem, programımda bir paylaşım için yazılmadan önce çok fazla yük var (SQL sorgulama, kullanıcı etkileşimi, vb.) Ve programım bir paylaşıma yazıldığında oldukça yoğun bir süreç (yani büyük zip dosyaları). Bu, kullanıcının UNC'ye doğru bir şekilde erişememesi durumunda, kullanıcının parçasında 5-10 milyonluk bir "boşa harcanmış" zamana yol açabilir.Elbette, IOExceptions için deneme/yakalamada bir şeyler salıyorum, sadece kullanıcının ne demek istediğini bilmesi için dua ediyorum (heh). Yardım için teşekkürler. – Jai

0

Bu'u daha önce hiç yapmadım, ancak yapmanız gereken şey NTFS'de Erişim Denetim Listesi'ni (ACL) kontrol etmektir.

C# ve "Erişim Kontrol Listesi" için bir web araması yaptım ve ilginizi çekebilecek birkaç isabet aldım. Bu daha temiz olabilir, ancak zaten yaptığınız şey daha kolay olmayabilir.