Acesso negado a alguns directórios - C# - Portugal-a-Programar
Acesso negado a alguns directórios
By mj2p, November 23, 2009 in C#
mj2p 0
Pessoal, estou a construir uma aplicação que necessita de mapear todos os directórios da partição C:. O problema é o seguinte: quando acedo a algumas pastas como C:\Programas lá vem a excepção UnauthorizedAcessException
Por favor, digam-me como posso dar a volta a esta situação.
softklin 11
Essas pastas são provavelmente o System Volume Information que encontras na raiz de cada disco, entre outras. Como o Windows não gosta que ninguém vá lá mexer, ele dá-te acesso negado.
Podes colocar um try catch no código, ficando algo do género
// teu codigo aqui de dentro do ciclo aqui
} catch (UnauthorizedAcessException ex) {
// simplesmente ignoramos esta pasta
Atenção que este código tem de estar dentro do ciclo, porque no caso de se dar a excepção, ele continua a executar as restantes iterações.
Nick antigo: softclean | Tens um projeto? | Wiki P@P
Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.
O meu código tem esse bloco try/catch, para conseguir ver a aplicação a correr e fazer os testes mínimos. No entanto, aquilo que eu referi é apenas uma pequeníssima parte daquilo que eu quero que seja a minha aplicação final, que será um cliente de FTP. Por isso, já estás mesmo a ver que não dá jeito nenhum a minha aplicação negar o acesso do utilizador a algumas pastas...
Precisava mesmo de um método prático para dar a volta a esta questão de segurança.
MetalFatigue 1
Penso que terás de dar privilégios de administrador à aplicação. Nunca fiz isso, mas aqui está o que uma rápida pesquisa no google encontrou: http://www.developerfusion.com/code/7987/making-a-net-app-run-on-vista-with-administrator-priviledges/
Não me sabem por acaso dizer se em Windows 7 este manifesto ainda funcionará?
apocsantos 210
Em teoria funciona perfeitamente. Na pratica não me dei ao trabalho de testar no Windows 7, mas como sempre deve haver solução para contornar esse problema, nem ke seja elevares a app a previlegios de administrador.
Desde já informo que apesar de já ter incluído o manifesto na minha aplicação ela continua sem conseguir a aceder aos directórios "proibidos" através do Windows 7. Quando corro a aplicação já me aparece aquela message box que pergunta ao utilizador se confia na aplicação que está a correr mas quando tento aceder a directórios do C: lá vem a p**a da excepção... Ninguém conhece mais nenhuma solução?
Experimentas-te compilar e correr a app com previlégios de administrador??
Não tenho nenhum Windows 7 a jeitos para fazer testes, mas seguindo a logica de SO, tens de conseguir aceder, nem que para isso tenhas que executar como system.
Diz se conseguiste que funcione ao executares a app como administrador. Assim terei um ponto de partida mais solido para "desmoer" um bocado a mioleira a dar a volta a isso.... Não acredito que o Windows 7 seja assim tão duro de roer.
Compilei já com o manifesto e nada. Quando corre a aplicação aparece a tal message box que pede para confirmar que a aplicação é de confiança (coisa que não acontecia antes de adicionar o manifesto) mas depois, quando carrego para me apresentar a lista dos directórios de C: aparece outra vez a excepção chatinha...
Aqui em casa não tenho nenhum Vista para testar, mas na segunda-feira já faço os testes no laboratório onde trabalho. Se alguém entretanto testar em Windows 7 e encontrar alguma solução diga.
Tanto quanto consegui ler no site da microsft não existe nada sobre o assunto.
Entretanto vou ver se acedo a uma maquina Windows 7 e testar. Em Vista consegui fazer um form e mapear todo o disco, sem stress apenas com aquele pedaço no manifesto.
Vamos a ver o que o Windows Seven traz de novo.
Olha já agora, que método estás a utilizar para aceder aos directorios de uma determinada pasta? Se calhar pode ser esse o problema. Eu tenho da seguinte forma:
DirectoryInfo dir = new DirectoryInfo ("C:\");
DirectoryInfo[] subDirs = dir.GetDirectories();
andreb 0
Boas, mj2p tenta abrir esses directórios que te dão erro mesmo com o "explorador do window", provavelmente ele não te deixa abrir porque não tens direitos para tal e sendo assim o teu cliente de FTP não poderia ser uma excepção.
Boas. Se calhar fui eu que não percebi bem, mas quando dizes abrir pelo explorador do windows referes-te a não usar a minha aplicação e usar o explorer, é isso?
apocsantos, diz-me como é que estás a fazer para abrir os directórios que eu a pouco testei num XP e nem aí dá.
Fim de semana e tal, já tive aqui a fazer um teste rapidíssimo. No windows 7, nem sequer precisei do manifesto para retornar os nomes dos subdirectorios do "program files". Não estarás a usar uma conta limitada? Eu estou a usar uma conta de administrador. Penso que com uma conta limitada terás de pedir password. Devo dizer que o UAC está como vem de default, nunca lhe mexi. E em Windows 7 é bem menos "chato".
O código simples foi seguinte, no form_load:
DirectoryInfo di = new DirectoryInfo("C:/Program Files/");
DirectoryInfo [] rgFiles = di.GetDirectories() ;
foreach (DirectoryInfo fi in rgFiles)
MessageBox.Show(fi.Name);
Ok, tudo certo até aqui. E por exemplo fazer com que este bocado de código funcione?
DirectoryInfor dir = new DirectoryInfo ("C:/Programas");
DirectoryInfo subDirs = dir.GetDirectories();
foreach(DirectoryInfo d in subDirs)
MessageBox.Show(d.FullName);
Mapear o C: tudo bem. E o conteudo dos sub-directórios de C:?
Experimentarei quando chegar a casa logo a noite. Mas assim de repente, e eu não estou muito treinado em C#, não deveria esta linha:
ser assim:
DirectoryInfo [] subDirs = dir.GetDirectories();
Poderá funcionar. Das duas formas, como disse não estou muito treinado em C# (algo que estou a pensar em resolver para breve )
Bem pelo que estive a ver tens um problema (além de teres aquele erro da falta de [] e de um r a mais no DirectoryInfor, mas deve ter sido lapso de escrita), não com a falta de permissões, mas com os nomes. O windows internamente usa à mesma "program files", mas tem um Alias para as várias línguas para certos directórios. Ou seja "Programas" é na verdade "Program Files". Este é o problema.
Se fores buscar tudo através do C:/ dinamicamente este problema desaparece. Uma vez que ele devolve o nome interno (Program Files)