2012-02-17 2 views
1

Windows 7 컴퓨터에서 전체 관리자 권한을 가지고 있지만 c : \ 드라이브에 파일을 만드는 응용 프로그램을 실행할 때 오류 코드 5가 발생합니다 (액세스가 거부되었습니다). 윈도우 7은 C 드라이브 및 프로그램 파일과 같은 보호 된 영역에서 파일을 만들 수 없다는 것을 알고 있습니다. 파일 탐색기는 '관리'메시지 상자를 가져옵니다. 그 곳에서 파일을 복사하면 다른 곳에서 파일을 복사 할 수 있지만 내 응용 프로그램은 쓰기 레벨을 얻을 수 있습니다. 접속하다?Windows 7에서 C : 드라이브에 액세스

내 응용 프로그램에서는 사용자가 파일을 만들 폴더를 선택하므로 c : \ drive s /를 선택하면 분명히 바람직하지 않은이 오류가 발생합니다.

void CTestDlg::OnBnClickedButtonCreate() 
{ 
    CFile f; 
    CFileException e; 
    TCHAR* pszFileName = _T("c:\\test.txt"); // here i am hard coding path for simplicity. 
    if(!f.Open(pszFileName, CFile::modeCreate | CFile::modeWrite, &e)) 
    { 
     TRACE(_T("File could not be opened %d\n"), e.m_cause); 
    } 

} 

는 지금까지 내가 연구 한대로 내가 잘되는 UAC 대화 상자를 바이 패스 할 수없는 것 같습니다하지만 내 응용 프로그램이 없어도 존재하는 것이 (물론 이해할 수있는)하지만 내 옵션은 무엇입니까?

내 유일한 옵션은 이것이 Windows 7 OS이고 파일을 만들기 전에 파일 경로를 확인하고 더 사용자 친화적 인 메시지를 표시하는 것입니다. '창 7은 사용자가 생성하는 것을 좋아하지 않습니다. 이 폴더에있는 파일을 다른 폴더를 선택하거나 xp '로 돌아가십시오. 이 구성표가 Windows 7을 사용할 수있는 방법입니까? 다른 방법이 있습니까?

+0

가능한 중복 [Windows 7은 Vista와 동일한 문제가 있습니까?] (http://stackoverflow.com/questions/5210575/does-windows-7-have-the-same-problem-as-vista) –

+0

아니요, 유일한 옵션은 * Windows 7 * 및 * Windows XP 모두에서 적절한 폴더를 사용하는 것입니다. 이 파일은 사용자의 폴더 중 하나이며 디스크의 루트 디렉토리가 아닙니다. 디스크의 루트 디렉토리에 물건을 넣지 마십시오. –

+1

@CodyGray 그들은 동일하지 않지만 둘 다 UAC와 관련이 있습니다. – zar

답변

3

Kolink가 언급했듯이 응용 프로그램은 관리자 권한으로 실행해야합니다. 자동으로 수행하려면 설명 된대로 매니페스트를 삽입하십시오 (here).

편집 : VS2010 : 프로젝트 속성> 구성 속성> 링커> 매니페스트 파일 'UAC 실행 수준'을 원하는 값으로 변경하십시오.

+1

실제 답변은 기사의 나머지 부분이 VS2005와 관련되어 있으므로 Microsoft에서 업데이트하지 않은 링크의 설명 섹션에 두 줄로 표시됩니다. VS2010의 경우 : 프로젝트 속성> 구성 속성> 링커> 매니페스트 파일 'UAC 실행 수준'을 원하는 값으로 변경하십시오 – zar

+0

@zadane : 죄송합니다. 수정을 찾아 주셔서 감사합니다. 나는 다른 사람들을위한 답변에 그것을 추가했습니다. –

1

보호 된 영역에 쓰거나 응용 프로그램을 권한 (오른쪽 클릭 => 관리자로 실행)으로 실행하지 마십시오.

나는 내 루트에 나타나는 임의의 파일이 마음에 들지 않는다는 것을 안다. 나는 조직 된 파일을 좋아한다.

+0

관리자 권한으로 프로그래밍 방식으로 실행할 수 있습니까? – zar

+1

@zadane 나는 그 마지막 질문에 대한 대답이 당신이 할 수 없다는 것을 정말로 기대한다. 그렇지 않으면 안전하지 않은 것처럼 보입니다. – webdreamer

+0

루트에 임의의 파일이 나타나는 것을 좋아하지 않는다면, 허용해서는 안됩니다. OP가 이것을 원한다. 그래서 그들이 물었다. – stu

0

경로를 제공하는 사용자 인 경우 파일을이 위치에 저장하고 다른 이름을 제공 할 것을 요청해야합니다.

일반적으로 셸 GetSaveFileName 함수는 반환하기 전에 선택한 디렉토리에 새 파일을 만들 수 있는지 확인합니다. 설명의 OPENFILENAME 구조를 참조하십시오.

또 다른 옵션은 이러한 상황을 처리하고 UAC 확인을 직접 표시하는 것입니다. 그러나이 솔루션은 실제로 가치가있는 것보다 훨씬 많은 노력이 필요합니다. 현재 프로세스를 승격 할 수 없으므로 파일을 보호 영역에 저장하는 작업을 다른 프로세스에서 구현해야합니다. 동시에 현재 프로세스에 저장할 데이터가 있으므로 두 프로세스 간의 통신을 구현해야합니다. 자세한 내용은 Designing UAC Applications for Windows Vista을 참조하십시오.

+0

새 파일을 선택한 디렉토리에 만들 수 있는지 확인하고 싶습니다. 그러나 CreateFile()은 다른 이유로 인해 잠재적으로 얻을 수있는 동일한 제네릭 코드 인 코드 5 '액세스가 거부되었습니다.'를 반환합니다. 권한 문제로 인해이 폴더가 확인되지 않은 것을 어떻게 구별 할 수 있습니까? 'GetSaveFileName'은 대상 폴더가 예를 들어 c : \ – zar

+0

인 경우 정확하게 수행합니다. '자막 액세스가 거부되었습니다'는 폴더에 쓰거나 읽을 수있는 권한이 없음을 의미합니다. 전체 관리자 권한으로 승격되면 폴더에 쓸 수있는 권한이 없습니다. 내가 확인하는 유일한 방법은 폴더 ACL을 분석하는 것입니다. 예를 들어 관리자 그룹에 쓰기 권한이 있는지 확인하는 것입니다. 그것은 총알 증명 아니에요. –

관련 문제