2012-01-12 17 views
7

.NET. Czy istnieje prosty sposób sprawdzenia, czy bieżący użytkownik ma dostęp do utworzenia pliku w katalogu? Coś równoważnego funkcji dostępu C++ byłoby idealne.W .NET, sprawdź, czy bieżący użytkownik może zapisywać do katalogu

Nie chcę używać prób i błędów (utwórz plik dummy, a następnie go skasuj): poza pozornym hackowaniem inne oprogramowanie monitoruje katalog w poszukiwaniu upuszczonych plików.

Nie chcę używać System.DirectoryServices: przeglądanie list ACL, rozdzielanie członkostw w grupach i sposób, w jaki uprawnienia z różnych interakcji pomiędzy grupami wydają się być podatne na błędy i zbyt trudne. Gdzieś tam musi być funkcja taa lub nie, nie?

Z góry dziękuję!

[edycja] jako bonus, gdyby działało również na udział sieciowy, byłoby fajnie.

+1

http://stackoverflow.com/a/265958/284240 Dlatego obsługuje wyjątki. –

+0

możliwy duplikat [Jak sprawdzić, czy mogę utworzyć plik w określonym folderze w języku C#?] (Http://stackoverflow.com/questions/316903/how-to-check-if-i-can-create-a -file-in-a-specific-folder-in-c) – Joe

+0

sprawdź tę odpowiedź, aby przekonwertować ją w VB.NET powinno być trywialne ;-) http://stackoverflow.com/a/130641/559144 –

Odpowiedz

5
FileIOPermission writePermission = new FileIOPermission(FileIOPermissionAccess.Write, filename); 
if (SecurityManager.IsGranted(writePermission)){ 
    //write here 
} else { 
    //some error message 
} 
+0

Zakładając, że działa (mam nadzieję), jedną z tych odpowiedzi, które sprawiają, że przegrywam, przeżywam pytanie i lubię go :) –

+0

Wygląda świetnie! Daj mi spróbować. –

+1

Wydaje się, że nie działa to dla mnie. Z jakiegoś powodu zawsze zwraca wartość true. To musi być coś, co robię źle, ale to jest takie proste, nie widzę, co by to było./westchnienie ... oznaczyłem to jako zaakceptowane, ponieważ wskazuje mi właściwe interfejsy API. Po prostu muszę to przetestować, chyba –

0

Poniższa powróci instancji DirecotrySecurity http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.directorysecurity.aspx

DirectoryInfo(pathstr).GetAccessControl() 
+1

Czy dotyczy to bieżącego użytkownika? Przyjrzałem się temu i wydawało się, że daje dostęp do listy ACL.Może to oznaczać, że grupa użytkowników "Foo Managers" ma prawo do zapisu, a "Bar Workers" jest odmowy, ale nie pomaga mi rozstrzygnąć, czy bieżący użytkownik jest członkiem grupy, która jest członkiem jednej z tych grup. Może tęsknię za tym, jak rozwiązać ten bit –

5

sprawdzanie zgody z góry to ryzykowne przedsięwzięcie. Nie wspominając już o skomplikowanych, przebiegających przez całą listę ACL i obliczających efektywny zestaw uprawnień.

Ponadto ... nie ma żadnych gwarancji. Tylko dlatego, że proaktywnie sprawdzałeś wcześniej, nie oznacza to, że uprawnienia nie zostały zmienione w momencie próby utworzenia pliku.

„Prawo” sposób jest, aby security demand albo deklaratywne z FileIOPermissionAttribute lub koniecznie, tworząc odpowiedni przypadek FileIOPermission i wywołanie jego metodę Demand(). Jeśli masz wymagane uprawnienia, połączenie z numerem Demand() powiedzie się; w przeciwnym razie wyrzuci on SecurityException, który musisz złapać i podjąć działania.

Z mojego doświadczenia wynika, że ​​kontrola niezbędna jest łatwiejsza.

Należy również zauważyć, że w systemie Windows 7, podczas gdy możesz mieć koncepcyjny dostęp do katalogu, może on nadal nie działać, dopóki nie będziesz mieć podwyższonych uprawnień.

+0

Zgadzam się całkowicie. Nie chciałbym sprawdzać uprawnień, aby ochronić operację, która może zawieść. Mamy starszą wersję systemu, która zawiera wiele programów, które działają na wielu serwerach i są ścigane przez problemy z admin/config. Muszę napisać aplikację, która przechodzi przez szukanie błędów konfiguracji, ale musi robić to pasywnie, bez szansy na osierocenie plików testowych/fałszywych lub tym podobnych. –

Powiązane problemy