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.
Sprawdz metode Directory.GetAccessControl().
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...
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 :)
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.
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.