Expiring Today—Celebrate National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Check directory for write access by current user

Posted on 2008-10-01
4
Medium Priority
?
2,625 Views
Last Modified: 2013-11-20
How do use MFC to check if the current user has write access to a directory?
0
Comment
Question by:steenpat
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
4 Comments
 
LVL 86

Accepted Solution

by:
jkr earned 1000 total points
ID: 22618586
You can use the following code:
#include <windows.h>
#include <svrapi.h>
#include <stdio.h>
 
BOOL IsAccessPermitted(LPCTSTR pszFolder) {
 
          HANDLE hToken;
	  // AccessCheck() variables
	  DWORD           dwAccessDesired;
	  PRIVILEGE_SET   PrivilegeSet;
	  DWORD           dwPrivSetSize;
	  DWORD           dwAccessGranted;
	  BOOL            fAccessGranted = FALSE;
	  GENERIC_MAPPING GenericMapping;
 
          SECURITY_INFORMATION si = (SECURITY_INFORMATION)( OWNER_SECURITY_INFORMATION
            | GROUP_SECURITY_INFORMATION
            | DACL_SECURITY_INFORMATION);
 
 
	  PSECURITY_DESCRIPTOR psdSD = NULL;
	  DWORD dwNeeded;
 
	  GetFileSecurity(pszFolder,si,NULL,0,&dwNeeded);
 
 
	  psdSD = (PSECURITY_DESCRIPTOR) new BYTE[dwNeeded];
 
	  if (!GetFileSecurity(pszFolder,si,psdSD,dwNeeded,&dwNeeded)) {
 
              printf("GetFileSecurity\n");
          }
 
      // AccessCheck() requires an impersonation token.
      ImpersonateSelf(SecurityImpersonation);
 
      OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, TRUE, 
            &hToken);
 
      // Using AccessCheck(), there are two different things we could do:
      // 
      // 1. See if we have Read/Write access to the object.
      // 
      dwAccessDesired = ACCESS_READ;
 
      // Initialize generic mapping structure to map all.
      memset(&GenericMapping, 0xff, sizeof(GENERIC_MAPPING));
      GenericMapping.GenericRead = ACCESS_READ;
      GenericMapping.GenericWrite = ACCESS_WRITE;
      GenericMapping.GenericExecute = 0;
      GenericMapping.GenericAll = ACCESS_READ | ACCESS_WRITE;
 
      // This only does something if we want to use generic access
      // rights, like GENERIC_ALL, in our call to AccessCheck().
      MapGenericMask(&dwAccessDesired, &GenericMapping);
 
      dwPrivSetSize = sizeof(PRIVILEGE_SET);
 
      printf("calling 'AccessCheck()'...\n");
 
      // Make the AccessCheck() call.
      if (!AccessCheck(psdSD, hToken, dwAccessDesired, &GenericMapping,
            &PrivilegeSet, &dwPrivSetSize, &dwAccessGranted, 
            &fAccessGranted)){
 
              printf("AccessCheck: %d\n",GetLastError());
          }
 
      printf("... 'AccessCheck()' succeeded\n");
      delete [] psdSD;
 
  return fAccessGranted;
}
 
void main () {
 
    BOOL bRes = IsAccessPermitted("c:\\Windows\\notepad.exe");
 
    printf("permitted: %s\n", bRes ? "Yes" :  "No");
 
}

Open in new window

0
 
LVL 14

Assisted Solution

by:wayside
wayside earned 1000 total points
ID: 22618636
Quick and dirty method would be to just create a file in the directory. If it succeeds, you have write access; if not, you don't.

CString mydir = "c:/windows/system32";

CString tempName = mydir + "/mytemp.foo";
CFile tempFile;

BOOL bOpenOK = tempFile.Open(tempName, CFile::modeCreate | CFile::modeWrite);
if (bOpenOK == TRUE) {
  // success! clean up.
  tempFile.Close();
  CFile::Remove(tempName);
}

0
 
LVL 17

Expert Comment

by:CSecurity
ID: 22623330
try to create a directory using CreateDirectory of try to create a file using CreateFile API function.
if one of above functions failed, check error reason using GetLastError() API to get error code.
if(GetLastError() == ERROR_ACCESS_DENIED) // or if(GetLastError() == 5)
//means that access denied
as "Wayside"s comment: quick and dirty way ;)
Regards
0
 

Author Comment

by:steenpat
ID: 22996449
I would like to comment that RevertToSelf is necessary at the bottom of this function otherwise it keeps running in the context of the client and this is undesirable. It caused issues with my application until I figured this out. I called RevertToSelf, and then CloseHandle(hToken) and this resolved issues.
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Article by: SunnyDark
This article's goal is to present you with an easy to use XML wrapper for C++ and also present some interesting techniques that you might use with MS C++. The reason I built this class is to ease the pain of using XML files with C++, since there is…
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.
Suggested Courses

718 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question