Diskuze: Přístup do UserFolder // Access denied!

C# .NET .NET (C# a Visual Basic) Přístup do UserFolder // Access denied! American English version English version

Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:

Ahoj :)
Potřebuju nějak napsat povolení pro program, aby mohl do User složky...
Vždy mi napíše že přístup byl odepřen :/

foreach (string d in Directory.GetDirectories(b))
          {
              try
              {

                  if ((d == data) || (d == appdata))
                  {
                      continue;
                  }
                  else
                  {
                      foreach (string f in Directory.GetFiles(d, pic))
                      {

                      }

                  }

              }
              catch (System.Exception excpt)
              {
                  Console.WriteLine(excpt.Message);

              }

Ví někdo jak to vyřešit?

Předem Děkuji :)

 
Odpovědět 20.7.2013 22:15
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

Zkoušel jsi to spustit jako administrátor ? Jednoduše, to že jsi programátor ti nedává nárok se dostat tam, kam běžní uživatelé nemohou. Takže tam nejspíš bude problém s právy složky.

EDIT: Kdybys to chtěl přímo z debugu spouštět jako administrátor, tak si přidej do projectu "Application Manifest File" a tam si najdi řádek

<requestedExecutionLevel level="asInvoker" uiAccess="false" />"

a ten přepiš na

<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />"
Editováno 20.7.2013 22:40
 
Nahoru Odpovědět 20.7.2013 22:35
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:

Proč by to měl spouštět s právy administrátora? Pokud bude ten program napsaný správně, půjde to i bez nich. Chce se přece dostat do legální složky, jen si asi popletl cestu.

Spouštět si nefunkční programy jako administrátor je dobrý způsob, jak si zdemolovat systém.

Editováno 20.7.2013 22:42
Nahoru Odpovědět 20.7.2013 22:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Kit
Jan Vargovský:

Jestli si jen zobrazuje obsah, tak natom nevidím nic zlého. Jinak s Tebou souhlasím.
K tématu, trošku jsem to testoval co tomu vadí a co ne a vadí tomu hidden directories, jinak k ostatním by ses měl normálně dostat.

 
Nahoru Odpovědět 20.7.2013 23:06
Avatar
Michal Žůrek (misaz):

jak si získal "user složku".? Jaký je její path? Nehrabeš se náhodou ve složce cizího uživatele?

Nahoru Odpovědět  +1 20.7.2013 23:08
Nesnáším {}, proto se jim vyhýbám.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Jan Vargovský:

Řekl bych, že asi takto :

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
 
Nahoru Odpovědět 20.7.2013 23:34
Avatar
Odpovídá na Jan Vargovský
Michal Žůrek (misaz):

To nebyl dotaz na tebe, ale na autora.

Doufám že tam nijak neskládáš string.

Nahoru Odpovědět 21.7.2013 8:56
Nesnáším {}, proto se jim vyhýbám.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Tomáš
David Čápka:

No to je zas jednou kód, slyšel jsi někdy o metodách?

Nahoru Odpovědět 21.7.2013 9:59
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš :

Tady je celý kod :)

string pic = "*.jpg";
           string b = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
           string appdata = Path.Combine(b, "AppData");
           string data = Path.Combine(b, "Data aplikací");



           foreach (string d in Directory.GetDirectories(b))
           {
               try
               {

                   if ((d == data) || (d == appdata))
                   {
                       continue;
                   }
                   else
                   {
                       foreach (string f in Directory.GetFiles(d, pic))
                       {

                       }

                   }

               }
               catch (System.Exception excpt)
               {
                   Console.WriteLine(excpt.Message);

               }
           }

Přes administrátora jsem to zkoušel už dřív nic...
Ty skrytí složky mam vyloučeny aby to nehledalo...
Na složce mam že s ní může dělat každý uživatel cokoliv ale furt to nejde..

 
Nahoru Odpovědět 21.7.2013 12:27
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:

To Sdraco : Ano metody znám ale tohle jsem sepsal takto jelikož mi to nejde..

Zde je ještě obrázek.
http://photo.uloziste.com/?…

 
Nahoru Odpovědět 21.7.2013 12:51
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Tomáš
David Čápka:

Problém je v tom, že tohle nejsou pravé názvy složek, ale jen české přesměrování. Koukni se třeba sem: http://social.msdn.microsoft.com/…torygetfiles

Nahoru Odpovědět 21.7.2013 13:38
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Když byly na Linuxu zavedeny lokalizované názvy některých složek, tak jsem z toho zpočátku byl také zmatený. Všechny se však nacházejí v domovském adresáři, takže to není zas tak velký problém. Uživatelé s Windows jsou na tom o něco hůř.

Nahoru Odpovědět 21.7.2013 13:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:

To Sdraco: A ten program si to nedokáže najít sám? :-D

A prohlížel jsem to.. A nějak furt nechápu co tam nemam nebo chybí :/
To je asi nad muj rámec možností :)

 
Nahoru Odpovědět 21.7.2013 14:42
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Tomáš
David Čápka:

Jak vidíš, tak asi nedokáže :) Řeší se to v tom vláknu co jsem ti poslal, musíš použít nějaké ty reparse pointy, nikdy jsem to nepotřeboval, protože když chci uživatelskou složku, tak pro ni má C# getter.

Nahoru Odpovědět 21.7.2013 14:49
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Tomáš
Neregistrovaný
Avatar
Odpovídá na David Čápka
Tomáš:

Takže se to dá obejít jinak než přes Foreach?

 
Nahoru Odpovědět 21.7.2013 14:53
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Tomáš
David Čápka:

Přečti si konečně co jsem ti poslal :)

Nahoru Odpovědět 21.7.2013 14:54
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Tomáš
Neregistrovaný
Avatar
Odpovídá na David Čápka
Tomáš:

Dobře Děkuji.. :)

 
Nahoru Odpovědět 21.7.2013 15:01
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Problém bude asi v tom, že mnoho návodů, které jsem našel, je o práci se soubory, jejichž cesta začíná C:\..., což je špatně. O zmíněných getterech jsem nenašel nic.

Netrápí mě to, protože na unixových systémech si obvykle vystačím se znakem ~ na začátku cesty k souboru.

Nahoru Odpovědět 21.7.2013 15:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

C# ti prostě dá složku o kterou si řekneš, třeba takhle:

string path = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Možná to není getter ale enum nebo konstanta nezkoumal jsem to, ale neřešíš tu žádné přesměrování nebo verzi windows a podobně. těch složek tam je spoustu.

Nahoru Odpovědět  +1 21.7.2013 15:22
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Aha, takže stačí původní

string b = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

nahradit

string b = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Vypadá to podobně a jak je vidět, dá se to poplést.

Nahoru Odpovědět 21.7.2013 15:29
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Nevím proč by se mělo plést Profil a Dokumenty, profil odkazuje do profilu, dokumenty do dokumentů :)

Nahoru Odpovědět 21.7.2013 15:30
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Tomáš je důkazem, že to poplést jde :)

Nahoru Odpovědět 21.7.2013 15:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:

Klídek klídek zase :D

S Dokumentama to stejne nefunguje.. Podsložky dokumnetů jsou videa obrázky.... A tam to m¨píše že přístup byl odepřen...

Nic to neřeší když vezmete složku z UserProfile složky.

 
Nahoru Odpovědět 21.7.2013 15:34
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Tomáš
David Čápka:

Evidentně jsi vůbec nepochopil kde je problém, samozřejmě, že podsložky opět nezískáš.

Nahoru Odpovědět 21.7.2013 15:41
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:

No nepochopil.. Moje znalosti C sharp nesahají nějak extra daleko..
Myslel jsem že to bude jednoduší.. Sepsání nejaký permission..
Ale Děkuji za snahu :)

 
Nahoru Odpovědět 21.7.2013 15:46
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Tomáš
David Čápka:

Prostě tyhle složky nezískáš tak snadno, protože 1. jsou v každém systému jinde a zadruhé tam je ajzykové přesměrování, proto když do nějaké z nich potřebuješ, použiješ ten getter.

Nahoru Odpovědět 21.7.2013 15:49
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Tomáš
Kit:

I kdyby to permission měl, zapisoval bys úplně jinam, než kam zapisovat chceš. Proto ti v tom systém zabránil.

Nahoru Odpovědět 21.7.2013 16:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:

Dobře řekl bych že oboum problémum jsme se ted vyhnul :)
Použil jsem getter:

string path = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

A hledal jsem ihned v něm:

string pic = "*.jpg";
           string path = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
try
               {
foreach (string f in Directory.GetFiles(path, pic))
                      {

                      }
 }
               catch (System.Exception excpt)
               {
                   Console.WriteLine(excpt.Message);

               }

Do složky jsme si naházel pár obrázků. A ani jeden mi to neukázalo..

 
Nahoru Odpovědět 21.7.2013 16:12
Avatar
Michal Žůrek (misaz):

Prosímtě tomáš přečti si tu tutorial pro práci se soubory.
http://www.itnetwork.cz/csharp/soubory

Nahoru Odpovědět 21.7.2013 16:16
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Tomáš
Kit:

Přiznej se, že jsi už něco četl od Majakovského? Není zrovna jednoduché to po tobě číst. Proč to odsazování nenecháš na editoru?

Do které složky sis naházel obrázky, které teď nemůžeš najít? Snad ne do profilu?

Nahoru Odpovědět 21.7.2013 16:31
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Asi máš na mysli tohle:

string cesta = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "DevbookTutorial");
string soubor = Path.Combine(cesta, "databaze.dat");
Nahoru Odpovědět 21.7.2013 16:35
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:

Ne nikdy jsem od něj nic nečetl :-D
Moje lehké zaklady jsme se naučil ve škole.. A tohle jsme ani nebrali..
Dělali jsme takové ty kalkulačky, šachy atd... Žádne programy preté by

Ty obrázky vim kde jsou ale program je tam nenajde v té složce..

 
Nahoru Odpovědět 21.7.2013 16:40
Avatar
Odpovídá na Tomáš
Michal Žůrek (misaz):

Tak nám ty chytrolíne ještě řekni co ten program má vlastně dělat.

Nahoru Odpovědět 21.7.2013 16:42
Nesnáším {}, proto se jim vyhýbám.
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:

Omlouvám se...

Které by se snažili něco získat nebo nějakm dostat a tak.. :)

 
Nahoru Odpovědět 21.7.2013 16:42
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:

Má mi vypsat všechny adresáře Obrázků..

a začíná v Userprofile...
Takže by měl project Dokumenty, Plochu a další složky na ploše..

Ps: Neřikám že jsem chytrolín..

 
Nahoru Odpovědět 21.7.2013 16:45
Avatar
Kit
Redaktor
Avatar
Odpovídá na Tomáš
Kit:

Práce s adresářovou strukturou není triviální. Učí se to obvykle až později, protože to ani není moc potřebné.

V C# by na to mohla být přímo nějaká metoda, která by ti dodala seznam souborů podle požadavků.

Editováno 21.7.2013 17:08
Nahoru Odpovědět 21.7.2013 17:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Nahoru Odpovědět 21.7.2013 17:14
Nesnáším {}, proto se jim vyhýbám.
Avatar
Odpovídá na Tomáš
Michal Žůrek (misaz):

Víš ty co, já ti ten program napíšu. Počkej 5 min.

Nahoru Odpovědět 21.7.2013 17:24
Nesnáším {}, proto se jim vyhýbám.
Avatar
Odpovídá na Tomáš
Michal Žůrek (misaz):

Tady máš celý zdrojový kód:

public static void Main(String[] arg)
{
        string userFolder = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

        List<string> files = ProhledejSlozku(userFolder);

        foreach (string f in files) {
                Console.WriteLine(f);
        }
        Console.ReadKey();
}

public static List<string> ProhledejSlozku(string path) {
        List<string> soubory = new List<string>();
        try {
                string[] podslozky = System.IO.Directory.GetDirectories(path);
                foreach (string p in podslozky) {
                        soubory.AddRange(ProhledejSlozku(p));
                }

        } catch (Exception) {
        }
        try {
                string[] fotky = System.IO.Directory.GetFiles(path, "*.jpg");
                foreach (string f in fotky) {
                        Console.WriteLine(f);
                }

        } catch (Exception) {
        }
        return soubory;
}
Editováno 21.7.2013 17:38
Nahoru Odpovědět 21.7.2013 17:37
Nesnáším {}, proto se jim vyhýbám.
Avatar
Tomáš
Neregistrovaný
Avatar
Odpovídá na Michal Žůrek (misaz)
Tomáš:

Wow! Děkuju moc! :)

 
Nahoru Odpovědět 21.7.2013 17:52
Avatar
Odpovídá na Tomáš
Michal Žůrek (misaz):

Není zač, pro mě je taková aplikace záležitost na 10 minut, zvlášť když polovinu za mě udělal .NET. Dávej si pozor, aplikace všechny cesty vipisuje 2x :D Zakomentuj si osmý řádek kódu.

Ten kód si projdi, ať výš co dělá a jak funguje. Doufám že si natolik slušný a program nenajdu nikde na netu.

Editováno 21.7.2013 17:58
Nahoru Odpovědět 21.7.2013 17:58
Nesnáším {}, proto se jim vyhýbám.
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:

Neboj na web to házet nebudu ;)

Měl jsem to podobně, ale nefungovalo mi to no...

Tohle tma být nemusí ne jen to vypisuje znova celej list..

foreach (string f in files)
          {
              Console.WriteLine(f);
          }

Ještě jedno Děkuju :)

 
Nahoru Odpovědět 21.7.2013 18:08
Avatar
Odpovídá na Tomáš
Michal Žůrek (misaz):

To že to vše vypisuje 2x, už vím.

Nahoru Odpovědět 21.7.2013 18:19
Nesnáším {}, proto se jim vyhýbám.
Avatar
Tomáš
Neregistrovaný
Avatar
Odpovídá na Michal Žůrek (misaz)
Tomáš:

No ještě že mě máš... :P
Tak ještě jendou Děkuju :)
A jestli to tu je tak to tu můžete uzavřít :)

 
Nahoru Odpovědět 21.7.2013 18:30
Avatar
Odpovídá na Tomáš
Michal Žůrek (misaz):

jinak, tam kam ten program nedostane přístup, tak tam se na to vykašle.

Nahoru Odpovědět 21.7.2013 19:32
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Koukám, že ses vykašlal na ošetřování výjimek. Také to tak v jednom programu mám.

Nahoru Odpovědět 21.7.2013 19:41
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Michal Žůrek (misaz):

no to jsou právě ty acces denied, mě to taky třeba nepusti do hlubin appdata. Nechtělo se mi to plácat k cestám do výstupu.

Jinak já to tak občas dělám, proč bych to ošetřoval.

Editováno 21.7.2013 19:43
Nahoru Odpovědět  +1 21.7.2013 19:42
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Tohle je jeden z mála případů, kdy má smysl tu výjimku neošetřovat. Místo ošetření do toho místa obvykle píšu "// Výjimečně zde není ošetření výjimky", aby si někdo nemyslel, že jsem pako. On si to pak myslí tuplem :)

Nahoru Odpovědět 21.7.2013 19:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Michal Žůrek (misaz):

Já jsem se s tím setkal u práce s vlastními soubory, kde musíš zjistit zda uživatel otevřel nějaký soubor přes tvou aplikaci a ošetřit to no a pokud nic neotevřel tak je to prázdé a hází to vyjimku, jenomže přeci není chyba když uživatel otevřel aplikaci normálně (bez souboru).

Nahoru Odpovědět 21.7.2013 19:55
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Pokud jsem to pochopil správně, tak se ptáš systému na seznam otevřených souborů. Pokud není otevřený žádný, vyhodí to výjimku? Trochu nešikovné a chápu, že to řešíš takhle.

Nahoru Odpovědět 21.7.2013 20:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Michal Žůrek (misaz):

jo, ona se to předává jako spouštěcí parametry.

Nahoru Odpovědět 21.7.2013 21:05
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Přes args[]? Myslel jsem, že není problém zjistit délku toho seznamu ještě před otevřením. Stejně musíš detekovat další typy argumentů.

Nahoru Odpovědět 21.7.2013 21:19
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Michal Žůrek (misaz)
Jiří Košata (kosata50):

Můžu se zeptat, proč si v podmínce nezkontroluješ, jestli má pole parametrů požadovaný počet prvků, ale místo toho budeš naslepo zkoušet přistoupit třeba k indexu 0 u prázdného pole a tim vznikne potřeba to obalit try-catch blokem, kde catch bude prázdný?

 
Nahoru Odpovědět  +1 21.7.2013 21:20
Avatar
Michal Žůrek (misaz):

Kit a Jiří Košata (kosata50): jenomže ve VB.NET okenních aplikacích žádné args[] není :D musíš Enviroment.Get­ComandLineArgs()

Nahoru Odpovědět 21.7.2013 21:49
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Je při použití args[] ve VB.NET jiný rozdíl než v zápisu? Pokud bych programoval ve VB.NET, určitě bych si na to udělal makro. Jako to ostatně dělám na všechno :)

Nahoru Odpovědět 21.7.2013 22:17
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Michal Žůrek (misaz)
Jiří Košata (kosata50):

Jenže Environment.Get­CommandLineAr­gs() vrací taky pole argumentů :) Jediný rozdíl oproti args[] tam je v první položce, kterou je vždy cesta k souboru, který ty argumenty převzal. Takhle to je u C#, předpokládám, že VB.NET to bude mít stejně :)

 
Nahoru Odpovědět  +1 21.7.2013 23:28
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 56 zpráv z 56.