Yola erişim neden reddedildi?


156

Dosyamı silmeye çalıştığım bir sorun yaşıyorum ama bir istisna alıyorum.

if (result == "Success")
{
     if (FileUpload.HasFile)
     {
         try
         {
              File.Delete(Request.PhysicalApplicationPath + app_settings.login_images + txtUploadStatus.Text);
              string filename = Path.GetFileName(btnFileUpload.FileName);
              btnFileUpload.SaveAs(Request.PhysicalApplicationPath + app_settings.login_images + filename);
         }
         catch (Exception ex)
         {
               Message(ex.ToString());
         }
      }
}

Ayrıca, silmeye çalıştığım klasörün ağ hizmetleri üzerinde tam denetime sahip olduğunu da belirtmeliyim.

Tam istisna mesajı:

System.UnauthorizedAccessException: 'C: \ Users \ gowdyn \ Documents \ Visual Studio 2008 \ Projects \ hybrid \ hybrid \ temp_loginimages \ enviromental.jpg' yoluna erişim reddedildi. C: \ Users \ gowdyn \ 'de hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click (Object sender, EventArgs e) şirketinde System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath) Belgeler \ Visual Studio 2008 \ Projeler \ karma \ karma \ Kullanıcı_Kontrolleri \ Imgloader_Add_Edit_Tbl.ascx.cs: satır 242

Herhangi bir fikir?


4
İstisna hakkında net olmayan ne var? Uygulamanın altında çalıştığı hesabın dosya / klasör için erişim ayrıcalıkları yok.
Oded

8
İstisnanın ne dediğini anlıyorum. Sorun, bu işlevselliğin sistemi kullanarak görüntüleri değiştirmesi gereken bazı kullanıcılar tarafından kullanılmasıdır. Bunun bir kısmı, eski görüntüyü silerek ve yeni bir görüntü kaydederek görüntüleri değiştirmektir.
nick gowdy

Klasöre erişim izinlerinizi kontrol edin. özellikler penceresinden güvenlik sekmesini kullanarak klasöre uygun izinleri verin
gasroot

6
İstisna hiç bilgilendirici değildir. Size şunu söylemez: A. Kaynağa erişmek için hangi müdürün çalıştığı B. Hangi izne ihtiyacı var. Öğrenmek için Windows SysInternals'ı yüklemeyi ve yol erişimini izlemeyi gerektirir.
ATL_DEV

Yanıtlar:


184

File.Delete Yöntemine Göre ...

Bu UnauthorizedAccessException, 4 şeyden biri anlamına gelir:

  • Arayanın gerekli izni yok.
  • Dosya, kullanımda olan yürütülebilir bir dosyadır.
  • Yol bir dizindir.
  • Yol salt okunur bir dosya belirtti.

77
Yol bir dizindir. Benim için utanç verici: /
Per G

4
Dün facepalm bana oldu . Bu belirsiz istisna mesajlarından nefret ediyorum :(
Broken_Window

1
Ben 6 saat boyunca mücadele ediyordu ve cevabınıza baktıktan sonra yolun dizin olduğunu gördüm ... teşekkürler bir ton @CrazyTim ..
Kullanıcı M

6
Path is a directory.Bu ipucu için teşekkürler :) Bana yardımcı oldu.
Sidron

8
Oh my ... Path bir dizin. Teşekkürler Microsoft. Bu ÇOK yetkisiz erişim.
SeriousM

181

Sorun da vardı, bu yüzden bu yazı bana tökezledi. Kopyalama / Silme işleminden önce ve sonra aşağıdaki kod satırını ekledim.

Sil

File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);

kopya

File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);

17
Klasöre 'Herkes' tam izinlerini başarıyla verdim. Her nasılsa bu dosya öznitelikleri çalıştı. Teşekkürler. Keşke MS nihayet uygun bir güvenlik modeline karar verseydi. Kopyala / Sil işleminin neden birkaç yılda bir patladığını anlamaya çalışmak, en azını söylemek sinir bozucu.
Steve

13
SetAttributes Normal benim için hüner oldu - File.Copy için çalışıyordum ve salt okunur bir dosyanın üzerine yazmaya çalışıyorum ..
Tom Hunter

6
Yola erişim engellendi, dosyanın salt okunur olduğunu göstermiyor (aslında yola erişiminiz var!) Bence hata mesajı değiştirilmelidir. Zaten ipucu için teşekkürler!
MBoros

1
Programı Yönetici olarak çalıştırdım ve sorun ortadan kalktı.
Santiago Villafuerte

5
Kopyalama işleminden sonra bir özniteliğin ayarlanması nasıl yardımcı olur? Kopyalama ifadesinde program çökmesi olmaz mı? Kopyalama işleminden önce silme işlemi gibi mi olmalı?
Vibhore Tanwer

31

Bu eski bir konudur, ama arama yaparken bu sorunla karşılaştım. SaveAs için kaydetme yolundaki gerçek dosya adı bileşenini eksik olduğum ortaya çıkıyor ...

string uploadPath = Server.MapPath("~/uploads");
file.SaveAs(uploadPath); // BAD
file.SaveAs(Path.Combine(uploadPath, file.FileName)); // GOOD

18

Bir kullanıcı Web sitenize bağlanmaya çalıştığında, IIS, IUSER_ComputerName hesabına bağlantı atar; burada BilgisayarAdı, IIS'nin üzerinde çalıştığı sunucunun adıdır. Varsayılan olarak, IUSER_ComputerName hesabı Guests grubunun bir üyesidir. Bu grubun güvenlik kısıtlamaları var. Bu klasöre IUSER_BilgisayarAdı'na büyük erişim sağlamaya çalışın

İşte IIS güvenliği hakkında çok iyi tarif edilmiş cevap

Bu yardımcı olur umarım


Bu yardımcı oldu teşekkürler .. IIS_IUSRS kullanıcı izni.
Tom

13

Visual studio'ya sağ tıklayın ve Yönetici Olarak Çalıştır'a tıklayın


Bu, yerel yönetici olduğum Windows 8.1 Enterprise makinesindeki File.Move sorunum için bir çözümdü ve başka hiçbir şey dosyalar üzerinde işlem görmüyordu.
Robert Kerr

13

Hatayı aldım çünkü hedefin bir dosya olması gerektiğini fark etmedim. Ben ikinci parametre (cmd olarak çalışır) olarak bir klasör vardı. Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied.C # var çünkü File.Movesadece ilk parametre için değil, ikincisi için de bir dosya istiyor ve bu yüzden bir dizini ikinci parametre olarak koyarsanız, bir dizine c:\crpsahip olduğunuzda olduğu gibi bir dosya yazmaya çalışıyor c:\crp.

bu yanlış olur File.Move(args[0],"c:\\crp");

Yani, bu doğru olur File.Move(args[0],"c:\\crp\\a.a");

Aynısı - için de geçerli File.Copy


1
Teşekkür ederim! Bu, bir API'nin dizin olarak verdiğim bir hedefi beklediği, dosya adını içermesi gerektiğini fark etmediği (nesnenin kendisiyle ilişkili bir dosya adı olduğu için) dolaylı olarak çözüldü.
Austin Salgat

7

Bu sorunlu bir IIS web sitesiyse, sitenin veya uygulamanın kullandığı uygulama havuzunun gelişmiş ayarlarının Kimlik özelliğini kontrol edin. ApplicationPoolIdentity olarak ayarlandığını görebilirsiniz ve bu durumda yola erişmesi gereken kullanıcı budur.

Ya da eski stile gidip Kimliği Ağ Hizmetine ayarlayabilir ve Ağ Hizmeti kullanıcısına yola erişim izni verebilirsiniz.


3

Silmeye / kaydetmeye çalıştığınız klasörün ayrıcalıklarını değiştirmeniz gerekir. İçeren klasöre sağ tıklayın ve uygulamanızın altında çalıştığı kullanıcının haklarında değişiklik yapılmasına izin vermek için Güvenlik sekmesini kullanın .


onun makinesinin yöneticisi olduğunu varsayıyorsunuz .. eğer bu bir iş makinesiyse ve sadece bir kullanıcıysa ... izinleri muhtemelen bir sebepten dolayı ayarlamışlardır .. çünkü sadece varsaymaya bırakıldık
MethodMan

1
Bu bir iş makinası ve ben güçlü bir kullanıcıyım. Yönetici olarak giriş yapmıyorum. Ağ hizmetlerinin tam erişime sahip olması için görüntü klasörünün özellikleri değiştirildi. Ama bu bir fark yaratmadı.
nick gowdy

1
Klasöre tam erişim olan "Herkes" i ve "voilá" ekledim
MarceloBarbosa

3

İşletim sistemi bir G / Ç hatası veya belirli bir güvenlik hatası türü nedeniyle erişimi engellediğinde ortaya çıkan kural dışı durum.

Aynı şeyi vurdum. Dosyanın GİZLİ OLMADIĞINDAN emin olun.


3

Pencere hizmetim istisnayı atmaya başladığında da bu sorunla karşılaştım

System.UnauthorizedAccessException: Access to the path "C:\\Order\\Media
44aa4857-3bac-4a18-a307-820450361662.mp4" is denied.

Bir çözüm olarak, aşağıdaki ekran görüntüsünde gösterildiği gibi, hizmetimle ilişkili kullanıcı hesabını kontrol ettim

resim açıklamasını buraya girin

Yani benim durumumda AĞ HİZMETİ

Ardından , ilişkili kullanıcı hesabının da izin sekmelerinin altında olup olmadığını kontrol etmek için klasör özelliklerine gitti . Benim durumumda eksikti ve eklediğimde sorunumu düzeltti.

Daha fazla bilgi için lütfen aşağıdaki ekran görüntüsünü kontrol edin

resim açıklamasını buraya girin


3

benim için de aynı sorunu, dosya yerine klasörü işaret ediyordum.

bu yüzden yoldan emin olun, yol + dosya adı verin

System.IO.File.WriteAllBytes("path", bytearray);

2

Dosya özelliklerinizi kontrol edin. Salt okunur işaretliyse, işaretini kaldırın. Bu benim UnauthorizedAccessException ile ilgili kişisel sorunumdu.


2

Bu hatayı aldım ve bir dakika içinde çözdüm. Tüm klasörlerimin neden salt okunur olduğunu bilmiyorum , Salt okunur olanı iptal ettim ve uyguladım. Ancak, yine de salt okunurdur. Bu yüzden dosyayı kök klasöre taşıdım, işe yarıyor - çok garip.


2

İşletim sistemi bir G / Ç hatası veya güvenlik hatası nedeniyle erişimi engellediğinde, bir UnauthorizedAccessException özel durumu atılır.

Bir dosyaya veya kayıt defteri anahtarına erişmeye çalışıyorsanız, salt okunur olmadığından emin olun .


2

BitDefender kullanıyorsanız, Güvenli Dosyalar özelliğinin çalışmanızı engelleme olasılığı yüksektir . Bu, bazı daha gelişmiş sürümleriyle birlikte gelen bir Ransomware koruması biçimidir.

BitDefender'da uygulama erişiminize izin verdiğinizden emin olun ve tekrar deneyin.

Daha fazla ayrıntı bu BitDefender destek sayfasında bulunabilir .


1

Paylaşılan bir sunucuda yeni taşınan bir web sitesinde de aynı sorunu yaşadım. Web yazma paneli (DotNetPanel) ile ayarlanmış "yazma izinlerine izin ver" doğru çözüldü. Bu nedenle, sunucu yapılandırmasına bir göz atmaya değer tüm kodu gözden geçirmeden önce paylaşılan bir sunucudaysanız ve size çok zaman kazandırabilir.


1

Kodunuzdan bir paylaşımlı klasör yoluna ulaşmaya çalışıyorsanız, yalnızca güvenlik sekmesinden fiziksel klasöre doğru izinleri vermeniz gerekmediğini unutmayın. Ayrıca klasörü Paylaş Sekmesi aracılığıyla ilgili uygulama havuzu kullanıcısıyla "paylaşmanız" gerekir


1

Bu hatayla karşılaştım çünkü

Bazen ben yolu ile Dosya Adı veCombineFileName = ""

Bu hale Path Directorybir değil filegibi bir sorun olan yukarıda belirtilen

Eğer kontrol gerekir böylece FileNameböyle

if(itemUri!="")
        File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));

1

Bir dosyayı silerken tam bir hatayla karşılaştım. Hizmet Hesabı altında çalışan ve .pdf dosyasını Paylaşılan Klasörden silemeyen bir Windows Hizmeti'ydi.

Benim için işe yarayan, Paylaşılan Klasör> Gelişmiş> Paylaş> Ekle'nin Güvenlik sekmesine gitmekti.

Daha sonra hizmet hesabını yöneticiler grubuna ekledim, değişiklikleri uyguladım ve hizmet hesabı daha sonra bu klasördeki tüm dosyalarda tüm işlemleri gerçekleştirebildi.


1

Bir UWP (Evrensel Windows) uygulaması yapmaya çalışanlar için dosya izinleri çok daha kısıtlıdır ve genel olarak varsayılan olarak reddedilir. Ayrıca sistem kullanıcı izinlerinin yerine geçer. Temel olarak yalnızca şu dosyalardan birine erişebilirsiniz:

  • Kurulum yeriniz
  • AppData konumunuz
  • Dosya veya Klasör seçicisinden seçilen dosyalar
  • Uygulama Bildiriminizde istenen yerler

Ayrıntılar için daha fazla bilgiyi buradan edinebilirsiniz => https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions


1

Benim durumumda problem Norton'du. Şirket içi programımın uygun dijital imzası yok ve bir dosyayı silmeye çalıştığında UnauthorizedAccessException verdi.

resim açıklamasını buraya girin

Size bir bildirim gönderirse, oradan yönetebilirsiniz. Benim durumumda fark ettiğim bir bildirimde bulunmadı. Norton'un programı engellemesini nasıl engelleyeceğiniz aşağıda açıklanmıştır.

  1. Norton'u aç
  2. Aşağı oku tıklayın
  3. Tıklama Geçmişi
  4. Programa göre etkinlik bulma
  5. Diğer Seçenekler'i tıklayın
  6. İşlemi Hariç Tut'u tıklayın

0

Ben de sunucuda dağıtımdan sonra bunu yapmaya çalışırken aynı sorunla karşı karşıya:

dirPath = Server.MapPath(".") + "\\website\\" + strUserName;
if (!Directory.Exists(dirPath))
{
    DirectoryInfo DI = Directory.CreateDirectory(dirPath);
}
string filePath = Server.MapPath(".") + "\\Website\\default.aspx";
File.Copy(filePath, dirPath + "\\default.aspx", true);
File.SetAttributes(dirPath + "\\default.aspx", FileAttributes.Normal);

IIS'de yönetici dahil başka bir gruba izin verdim ve sorunum çözüldü.


0

Bu hatanın aksine TASARIM MODU'nda oluşabileceğini buldum? yürütme modu ... Bir .INI veya .HTM dosyasına (yapılandırma dosyası, yardım dosyası) erişim gerektiren bir sınıf üyesi oluşturmak gibi bir şey yapıyorsanız, bildirimdeki öğeyi BAŞLATMAMAK, ancak daha sonra başlatmak isteyebilirsiniz. FORM_Load () vb. içinde ... Başlatırken ... Guard IF deyimi kullanın:

    /// <summary>FORM: BasicApp - Load</summary>
    private void BasicApp_Load(object sender, EventArgs e)
    {
        // Setup Main Form Caption with App Name and Config Control Info
        if (!DesignMode)
        {
            m_Globals = new Globals();
            Text = TGG.GetApplicationConfigInfo();
        }
    }

Bu, MSVS Designer'ın tasarım modundayken INI veya HTM dosyası oluşturmaya çalışmasını önler.


0

Bir klasörü taşındıktan veya oluşturulduktan sonra çok hızlı bir şekilde yeniden adlandırmaya çalıştığımda bu hatayı aldım.

Basit bir System.Threading.Thread.Sleep(500);çözüm:

void RenameFile(string from, string to)
{
   try
   {   
      System.IO.File.Move(from, to)      
   }   
   catch 
   {  
       System.Threading.Thread.Sleep(500);      
       RenameFile(from, to);      
   }   
}

Klasörün taşınmasından önce yarım saniye uyumak yerine var olup olmadığını kontrol etmenin daha iyi olacağını düşünün ... İşletim sistemi meşgulse önceki hareket yarım saniyeden daha uzun sürebilir ve aynı soruna geri dönebilirsiniz.
Paul Zahra

Bu kod parçası çok tehlikelidir. Hangi istisna atılacak olursa olsun RenameFile yöntemini tekrarlar! İstisna nedeni gerçek bir izin sorunu ise uygulamanın çökmesine neden olabilir
Hossein Shahdoost

0

Benim özel durumumda defalarca 10000 klasör oluşturup sildim. Bana öyle geliyor ki, sorun, yöntem Directory.Delete(path, true)geri dönmesine rağmen, temel OS mekanizması hala diskten dosyaları siliyor olabilir. Ve eskilerini sildikten hemen sonra yeni klasörler oluşturmaya başladığımda, bazıları henüz tamamen silinmediği için hala kilitli. Ve ben System.UnauthorizedAccessException alıyorum: "Yola erişim reddedildi".

resim açıklamasını buraya girin

Thread.Sleep(5000)Sonra kullanmak Directory.Delete(path, true)bu sorunu çözer. Bunun güvenli olmadığına kesinlikle katılıyorum ve kimseyi kullanmaya teşvik etmiyorum. Cevabımı iyileştirmek için bu sorunu çözmek için burada daha iyi bir yaklaşım isterim. Şimdi sadece bu istisnanın neden olabileceği hakkında bir fikir veriyorum.

class Program
{
    private static int numFolders = 10000;
    private static string rootDirectory = "C:\\1";

    static void Main(string[] args)
    {
        if (Directory.Exists(rootDirectory))
        {
            Directory.Delete(rootDirectory, true);
            Thread.Sleep(5000);
        }

        Stopwatch sw = Stopwatch.StartNew();
        CreateFolder();
        long time = sw.ElapsedMilliseconds;

        Console.WriteLine(time);
        Console.ReadLine();
    }

    private static void CreateFolder()
    {
        var one = Directory.CreateDirectory(rootDirectory);

        for (int i = 1; i <= numFolders; i++)
        {
            one.CreateSubdirectory(i.ToString());
        }
    }
}

0

Öncelikle, sürücü harfinden sonra iki nokta üst üste (:) karakteri eksik olup olmadığını görmek için yolu kontrol edin. İki nokta üst üste işareti yoksa, bu yol için erişim / yazma izninin verilip verilmediğini kontrol edebilirsiniz. Aynı sorunu vardı ve sadece iki nokta üst üste, izin eksik ve her şey iyiydi.

C:\folderpath

iyi çalışır ama,

C\folderpath .........(missing colon)

erişim engelleme hatası verir.


0

System.IO.File.OpenWrite (yol) kullanmaya çalışıyordum

ve sadece OpenWrite () bir dizine bir yol geçiyordu çünkü işe yaramadı, ama yazmak istediğiniz dosyaya bir yol gerektirir. Bu nedenle UnauthorizedAccessException özelliğinin önlenmesi için dosya adı.extension içeren bir tam yolun OpenWrite'a geçirilmesi gerekir


0

Ben de aynı konu ile ilgili olarak bu yazı ile karşılaştı. Görünüşe göre dosya kullanımda ve dolayısıyla dosyaya yazılamıyor. Anlayamama rağmen, hangi süreç kullanıyor? Bu kutuda oturum açmış olan diğer kullanıcının oturumu kapatıldı, elinde tutan kullanıcıları görmeyin. Aynısını nasıl bulacağınızla ilgili hızlı ipuçları.

Teşekkürler, Lakshay (geliştirici)


Cevabınızda yeni bir soru göndermeyin, ancak orijinal posterin sorusunu faydalı bilgilerle cevaplamaya çalışın. Kendi sorunuz için lütfen aynı veya benzer sorular için önce stackoverflow'u arayın. Herhangi bir şey bulamazsanız, bu kılavuzu takip ederek yeni bir soru gönderin
alev

0

Bu sorunu çözmek için, ben de Scot Hanselman yaklaşımı takip Hata System.UnauthorizedAccessException (genellikle ardından: yoluna erişim engellendi) makalesine örnekle kodu feryat geçerli:

class Program
{
    static void Main(string[] args)
    {
        var path = "c:\\temp\\notfound.txt";
        try
        {
            File.Delete(path);
        }
        catch (UnauthorizedAccessException)
        {
            FileAttributes attributes = File.GetAttributes(path);
            if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            {
                attributes &= ~FileAttributes.ReadOnly;
                File.SetAttributes(path, attributes);
                File.Delete(path);
            }
            else
            {
                throw;
            }
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.