Prawa odczytu katalogow - poratujcie

0

Mam taki problem - mam katalog, a raczej sciezke do niego w stringu, i chcialbym sie dowiedziec czy moge ten katalog otworzyc do czytania - konkretnie to czy moge wylistowac sobie jakie w nim sie zawieraja pliki i podkatalogi. Nie potrafie sie doszukac w tym calym MSDN, albo tak zakopali albo ju zprzesiaklem api do Javy, wiec prosze o pomoc doswiadczonych dotnetowcow.

0

Sprawdz metode Directory.GetAccessControl().

0

I co moge dalej zrobic z taka wartoscia pobrana? Sory ze tak pytam ale na prawde nie czaje tego C#, jakies dziwne maja pomysly czasami...

0

Krotki kurs msdn:

Tu jest opis metody GetAccessControl na msdn
Klikasz sobie na interesujaca Cie wersje metody, dla nas jest to:

Directory.GetAccessControl (String)

Po otwarciu strony dowiadujesz sie, ze dla C# metoda ta zwraca obiekt typu DirectorySecurity:

C#

public static DirectorySecurity GetAccessControl (
string path
)

No to szukasz sobie w przegladarce u gory po prawej tekstu: "DirectorySecurity class", zeby sie dowiedziec co to. Pamietaj o tym, zeby szukac w odpowiedniej przestrzeni nazw (sa tez takie klasy w System.Web.costam). Msdn powinien wyswietlic ja na pierwszym miejscu w wyniku. Po lewej w drzewku wybierasz sobie podkategorie members, zeby zobaczyc co takiego w sobie kryje ten obiekt. Tam znajdujesz ciekawie brzmiaca metode o nazwie GetAccessRules i ponownie zaglebiasz sie w jej tajniki i dowiadujesz sie, ze zwraca obiekt typu AuthorizationRuleCollection. Ponownie wpisujesz sobie w wyszukiwarke tekst: "AuthorizationRuleCollection class". Tu juz nie musisz zaglebiac sie w members, bo jako, ze jest to kolekcja, to bardziej interesuje Cie z czego sie sklada, a nie co mozna na niej robic (pewnie to samo co na wszystkich kolekcjach). Z opisu na samym poczatku dowiadujesz sie, ze jest to kolekcja obiektow typu AuthorizationRule, wiec klikasz sobie na to :) i tam dowiadujesz sie, ze z tego dziedziczy rowniez Access Rule. Z Access Rule dowiadujesz sie, ze ma takie wlasciwosci jak IdentityReference i AccessControlType.

To wszystko pozwala napisac np. taki programik:

using System; using System.IO; using System.Security.AccessControl;

namespace Test
{
class Program
{
static void Main()
{

    	DirectorySecurity sec = Directory.GetAccessControl(@"C:\program files");
    	foreach(AccessRule vRule in sec.GetAccessRules(true, true, (new System.Security.Principal.NTAccount("a").GetType())))
    		Console.WriteLine(String.Format("Uzytkownik: {0} Dostep: {1}", vRule.IdentityReference.Value, vRule.AccessControlType));
    	Console.Read();
    }
}

}


Ale, jezeli po prostu chcesz sprawdzac czy przy odczytywaniu zawartosci katalogu uda Ci sie to, to mozesz wykorzystac fakt, ze metoda Directoty.GetFiles() w razie braku uprawnien wyrzuca wyjatek UnauthorizedAccessException - skoro czytasz nazwy i taki wyjatek wyskakuje to znaczy, ze nie masz dostepu :)

Mam nadzieje, ze cos wyjasnilo :)
0

Prawde mowiac, to ja wymiekam przy tym, nie czaje.
Nie zdarza mi sie to i wiem ze jest to tepione na forum ale tym razem musze to zrobic: mozesz mi napisac kod ktory sprawdzi czy mam pozwolenie na wylistowanie sobie zawartosci katalogu? Cos w stylu jakiegos ifa ktory to ladnie zrobi?
Napiszesz, wielkie dzieki, nie napiszesz, rozumiem, i tak wiele pomogles.

0

Najlatwiej bedzie tak jak napisalem pod spodem, czyli:

String [] files; try { files = Directory.GetFiles(@"c:\program files"); } catch(UnauthorizedAccessException iException) { files = null; } if(files == null) Console.WriteLine("Brak uprawnien do wylistowania katalogu"); ```

Ten kod ma ta wade, ze w razie posiadania uprawnien wylistuje od razu katalog, a nie zawsze jest to potrzebne - tracisz wiec troche na szybkosci. Za to jest dosc prosty i zrozumialy.

Postaram sie jeszcze poszukac TYLKO sprawdzania, ale chwilowo nie mam za wiele czasu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1