2016-05-31 6 views
0

로컬 시스템으로 실행되는 서비스 프로세스로로드되는 DLL을 작성했습니다. 내가 만든 파일을 삭제할 수 없어야합니까?SYSTEM 서비스 계정의 CreateFile/Close 핸들 후 DeleteFile이 실패합니다.

HANDLE hFile = CreateFileW(m_achTempFilePath, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ; 

이 성공합니다. 다음 내가 CloseHandle(hFile)

DeleteFile(m_achTempFilePath)

를 실행 삭제 파일 액세스가 거부 실패합니다.

다음을 실행하여 &sa을 보안 특성으로 CreateFile에 전달한 다음 DeleteFile을 성공했습니다. 그러나 이것은 모든 사람에게 완전한 제어권을 제공합니다. 나는 그것을 원하지 않는다.

이 작업을 수행하는 올바른 방법은 무엇입니까?

CDacl dacl; 
dacl.AddAllowedAce(Sids::World(), SPECIFIC_RIGHTS_ALL | STANDARD_RIGHTS_ALL) ; 
CSecurityDesc sd; 
sd.SetDacl(dacl); 
CSecurityAttributes sa; 
sa.Set(sd, true); 
+0

임시 파일이 생성되는 폴더의 권한을 "삭제"작업을 거부하도록 설정할 수 있습니까 (다른 작업을 허용 함)? 이를 확인하려면 탐색기에서 폴더의 "속성"컨텍스트 메뉴로 드릴 다운하고 "삭제"가 다른 작업과 구분 될 때까지 SYSTEM 사용자의 "고급"보기를 계속 선택하십시오. –

+0

디렉토리의 소유권을 획득하지 않고 시스템 사용자에게 권한을 어떻게 표시합니까? 나는 지침 [여기] (http://superuser.com/questions/172437/run-explorer-in-system-account-on-windows-vista-or-7-using-sysinternal-s-psexec)을 따랐다. 시스템으로 시작 메뉴가 시작되지만 탐색기 UI를 시작하여 파일 시스템을 로컬 사용자 계정으로 탐색합니다. 로컬 컴퓨터에서 확인하려는 경우 c : \ ProgramData \ Microsoft \ Search \ Data \ Temp \ usgthrsvc 디렉터리입니다. – tdemay

+0

수정 ... 잊어 버렸습니다. C : \ ProgramData로 옮겼습니다 ... 공통 앱 데이터 디렉토리 아래에 디렉토리를 만들었습니다. 디렉토리와 파일을 만들 수 있지만 로컬 시스템으로 실행중인 서비스 계정에서는 삭제할 수 없습니다. – tdemay

답변

0

파일 작성 방법에 항상 FILE_FLAG_DELETE_ON_CLOSE 플래그를 사용할 수 있습니다. 이렇게하면 파일 핸들을 닫으면 스스로 정리됩니다. 이 문제 자체는 Windows 기반의 커널 문제 일 수 있습니다.

이 문제를 해결하면 문제를 해결할 수 있습니다.

+0

사용 권한 문제에 대한 해결책이 필요합니다. 주위에 일이 아닙니다. 이것은 타이밍 문제가 아닙니다. 이 보안 컨텍스트에서 실행할 때 작성된 파일을 삭제할 수 없습니다. GetTempFileName으로 만든 파일을 삭제하거나 이름을 바꿀 수 없습니다. – tdemay