Muszę sprawdzić, czy użytkownik może napisać do folderu, zanim faktycznie spróbuje to zrobić.
Zaimplementowałem następującą metodę (w C # 2.0), która próbuje pobrać uprawnienia bezpieczeństwa dla folderu przy użyciu metody Directory.GetAccessControl () .
private bool hasWriteAccessToFolder(string folderPath)
{
try
{
// Attempt to get a list of security permissions from the folder.
// This will raise an exception if the path is read only or do not have access to view the permissions.
System.Security.AccessControl.DirectorySecurity ds = Directory.GetAccessControl(folderPath);
return true;
}
catch (UnauthorizedAccessException)
{
return false;
}
}
Kiedy szukałem w Google, jak testować dostęp do zapisu, nic takiego się nie pojawiło, a testowanie uprawnień w systemie Windows wydawało się bardzo skomplikowane. Obawiam się, że nadmiernie upraszczam rzeczy i że ta metoda nie jest niezawodna, chociaż wydaje się, że działa.
Czy moja metoda przetestowania, czy bieżący użytkownik ma dostęp do zapisu, działa poprawnie?
c#
permissions
directory
Chris B.
źródło
źródło
Odpowiedzi:
Jest to całkowicie poprawny sposób na sprawdzenie dostępu do folderu w języku C #. Jedynym miejscem, w którym może upaść, jest konieczność wywołania tego w ciasnej pętli, gdzie problemem może być narzut wyjątku .
Wcześniej zadawano inne podobne pytania .
źródło
Rozumiem, że ten post jest trochę za późno, ale ten fragment kodu może się przydać.
Upuść to w aplikacji na konsolę i sprawdź, czy robi to, czego potrzebujesz.
źródło
GetAccessControl
ale moje oprogramowanie jest w stanie rzeczywiście pisać do katalogu, na który patrzę ...?źródło
string tempFileName = Path.GetRandomFileName();
najwyraźniejPróbowałem większości z nich, ale dają one fałszywe wyniki pozytywne, wszystkie z tego samego powodu. Nie wystarczy przetestować katalog pod kątem dostępnego uprawnienia, musisz sprawdzić, czy zalogowany użytkownik jest członkiem grupy, która ma to pozwolenie. Aby to zrobić, uzyskujesz tożsamość użytkowników i sprawdzasz, czy jest członkiem grupy zawierającej FileSystemAccessRule IdentityReference. Przetestowałem to, działa bezbłędnie ..
źródło
(AccessRight & rule.FileSystemRights) > 0
spowodowane tym, że każdy odmowy dostęp podrzędny jest częściąAccessRight
środków, które nie są pełne dostęp doAccessRight
IMHO to jedyny w 100% niezawodny sposób na sprawdzenie, czy możesz pisać do katalogu, to faktycznie do niego pisać i ewentualnie wychwytywać wyjątki.
źródło
Na przykład dla wszystkich użytkowników (Builtin \ Users) ta metoda działa dobrze - ciesz się.
źródło
Spróbuj tego:
źródło
fsAccessRule.AccessControlType
może byćAccessControlType.Deny
.Twój kod pobiera
DirectorySecurity
dla danego katalogu i poprawnie obsługuje wyjątek (z powodu braku dostępu do informacji o bezpieczeństwie). Jednak w twojej próbce tak naprawdę nie przesłuchujesz zwróconego obiektu, aby zobaczyć, jaki dostęp jest dozwolony - i myślę, że musisz to dodać.źródło
Oto zmodyfikowana wersja odpowiedzi CsabaS , która zawiera jawne reguły odmowy dostępu. Funkcja przechodzi przez wszystkie FileSystemAccessRules dla katalogu i sprawdza, czy bieżący użytkownik ma rolę, która ma dostęp do katalogu. Jeśli nie znaleziono takich ról lub użytkownik jest w roli z odmową dostępu, funkcja zwraca wartość false. Aby sprawdzić prawa do odczytu, przekaż FileSystemRights.Read do funkcji; dla praw zapisu, przekaż FileSystemRights.Write. Jeśli chcesz sprawdzić uprawnienia dowolnego użytkownika, a nie bieżące, zastąp bieżącą identyfikatorem użytkownika WindowsIdentity żądaną identyfikacją WindowsIdentity. Odradzałbym także poleganie na takich funkcjach w celu ustalenia, czy użytkownik może bezpiecznie korzystać z katalogu. Ta odpowiedź doskonale wyjaśnia, dlaczego.
źródło
Powyższe rozwiązania są dobre, ale dla mnie ten kod jest prosty i wykonalny. Wystarczy utworzyć plik tymczasowy. Jeśli plik zostanie utworzony, jego średni użytkownik ma dostęp do zapisu.
źródło
Create
pozwolenie, ale nieDelete
w tym przypadku byłoby to return false mimo że użytkownik nie ma uprawnień do zapisu.Path.Combine
Zamiast tego użyj npPath.Combine(tempfilepath, "temp.txt")
.Możesz spróbować wykonać następujący blok kodu, aby sprawdzić, czy katalog ma dostęp do zapisu. Sprawdza FileSystemAccessRule.
źródło
W kodzie masz potencjalny stan wyścigu - co się stanie, jeśli użytkownik będzie miał uprawnienia do zapisu do folderu podczas sprawdzania, ale zanim użytkownik faktycznie zapisze w folderze, to uprawnienie zostanie cofnięte? Zapis wyrzuci wyjątek, który będziesz musiał złapać i obsłużyć. Zatem wstępna kontrola jest bezcelowa. Równie dobrze możesz po prostu pisać i obsługiwać wszelkie wyjątki. To jest standardowy wzorzec dla twojej sytuacji.
źródło
http://www.codeproject.com/KB/files/UserFileAccessRights.aspx
Bardzo przydatna klasa, sprawdź poprawioną wersję w wiadomościach poniżej.
źródło
Sama próba uzyskania dostępu do danego pliku niekoniecznie wystarcza. Test zostanie uruchomiony z uprawnieniami użytkownika uruchamiającego program - co niekoniecznie oznacza uprawnienia użytkownika, na których chcesz przetestować.
źródło
Zgadzam się z Ashem, to powinno być w porządku. Alternatywnie możesz użyć deklaratywnego CAS i faktycznie uniemożliwić uruchomienie programu, jeśli nie mają dostępu.
Uważam, że niektóre funkcje CAS mogą nie być obecne w C # 4.0 z tego, co słyszałem, nie jestem pewien, czy to może być problem, czy nie.
źródło
Nie mogłem zmusić GetAccessControl () do zgłaszania wyjątku w systemie Windows 7 zgodnie z zaleceniami przyjętej odpowiedzi.
Skończyło się na tym, że użyłem odmiany odpowiedzi SDD :
Mam nadzieję że to pomoże.
źródło
Napotkałem ten sam problem: jak sprawdzić, czy umiem czytać / pisać w określonym katalogu. Skończyło się na łatwym rozwiązaniu, aby ... faktycznie to przetestować. Oto moje proste, ale skuteczne rozwiązanie.
Mam nadzieję, że to pomoże !
źródło
Większość odpowiedzi tutaj nie sprawdza dostępu do zapisu. Po prostu sprawdza, czy użytkownik / grupa może „Zezwolić na odczyt” (Przeczytaj listę ACE pliku / katalogu).
Również iteracja przez ACE i sprawdzanie, czy pasuje do identyfikatora bezpieczeństwa, nie działa, ponieważ użytkownik może być członkiem grupy, od której może uzyskać / utracić uprawnienia. Gorzej niż grupy zagnieżdżone.
Wiem, że to stary wątek, ale dla każdego, kto teraz patrzy, jest lepszy sposób.
Pod warunkiem, że użytkownik ma uprawnienia do odczytu, można użyć interfejsu API Authz, aby sprawdzić Efektywny dostęp.
https://docs.microsoft.com/en-us/windows/win32/secauthz/using-authz-api
https://docs.microsoft.com/en-us/windows/win32/secauthz/checking-access-with-authz-api
źródło