c드라이브에 있는 모든 파일(하위 디렉토리 포함) 출력 중 엑세스 에러 발생 어떻하죠???(2)
글쓴이: inviolable / 작성시간: 월, 2014/07/14 - 1:15오후
이 질문을 올렸었는데, 언어가 c#이라는 것을 명시하지 않아서 다시 올립니다...ㅠㅠ 답변 주신 분 감사합니다.
c#이고요.
c드라이브를 루트 디렉토리로해서 하위 디렉토리까지 포함된 파일들의 이름과 갯수를 출력하는 프로그램인데요.
검색을 해서 폴더의 엑세스 권한을 수정하는 방법을 찾아 FullControl 권한을 얻었는데도 엑세스 권한이 없다고 나오네요...
코드까지 올려봅니다.
어떻게 해야될까요...ㅠㅠ
int count = 0; private void button1_Click(object sender, EventArgs e) { DirectorySecurity dSecurity = Directory.GetAccessControl(@"c:\System Volume Information"); dSecurity.AddAccessRule(new FileSystemAccessRule("XXX(계정인데 제 이름으로 되어있어서 프라이버시상 가렸습니다.)", FileSystemRights.FullControl, AccessControlType.Allow)); FileTree(textBox1.Text); textBox2.AppendText("위 경로에 있는 파일은 " + count.ToString() + "개 입니다."); } private void FileTree(string path) { var Dir = from h in Directory.GetDirectories(path) select h; foreach (var h in Dir) { if(h != null) FileTree(h); } var Files = from f in Directory.GetFiles(path) select f; foreach (var f in Files) { textBox2.AppendText(f + "\r\n"); count++; } }
Forums:
테스트해보니 잘 됩니다.
급히 테스트 프로그램을 만들어서 시도해봤는데 문제없이 잘 됩니다. CPP로 테스트하긴 했지만 닷넷에서도 Win32 API호출이 당연히 가능하므로 문제없이 잘 될 걸로 보입니다.
1. http://msdn.microsoft.com/en-us/library/windows/desktop/aa387705(v=vs.85).aspx 이걸로 프로세스에 백업/리스토어 권한을 줍니다.
2. http://stackoverflow.com/questions/2314542/listing-directory-contents-using-c-and-windows 여기에 나온 ListDirectoryContents 로 C:\System Volume Information 의 내용을 출력합니다.
1번을 생략할 경우 출력에 실패했고, 1번을 적용했을 경우 잘 출력이 되었습니다. 프로그램 실행은 어드민 권한으로 했습니다.
http://stackoverflow.com/questions/5510311/how-can-i-manipulate-token-privileges-in-net 이 문서를 참고하면 닷넷에서 이를 쉽게 적용할 수 있겠네요.
좀더 시간이 있었으면 닷넷 소스를 올려드렸을텐데 말이죠..
--
윽... 토나오네요...-_-;;
winapi32 함수 원형을 일일히 닷넷의 것으로 바꾸려고 하니 너무 힘드네요;;; luid는 int배열로 해도 되는지요...
닷넷 함수로 하는 방법은 없나요??? 시간은 충분하니 닷넷 함수로 하는 방법 좀 알려주시면 정말 감사하겠습니다.
요지는 프로세스 권한의 문제인가요??? 프로세스 권한을 어떻게 해야되는지 알려주시면 닷넷 함수로 해보는데 큰 도움이 될 거라고 생각합니다만...
그렇습니다.
그런데 그걸 조절하는게 제가 알기론 닷넷에서 직접 지원하질 않는 걸로.. 그래서 저 많은 API interop들이 필요해지는 거지요.
제가 올려드린 마지막 링크에 이미 누가 그 API관련 준비작업을 해놓은 게 있습니다. 그러니 그냥 갖다 쓰시기만 하면 됩니다.
정 힘들면 C++/CLI 등으로 작업하고 그걸 그냥 C#에서 호출하셔도 됩니다. 네이티브 함수 사용량이 많아지면 이쪽이 맞는 방법입니다.
--
되네요. 감사합니다.ㅠㅠ
c 콘솔로 해서 프로세스 생성해서 핸들 얻은 다음에 그 핸들 넘겨주니까 되네요..ㅠㅠ
댓글 달기