關於使用CreateFile這個API的win7使用者權限問題

kenet123 2014-08-29 03:08:21
大家好

小弟想寫一個播放軟體來讀取特定格式的外接式硬碟並且播放裡面之影像資料
windows沒有辦法打開這顆硬碟,而我透過一下面這段程式來取得資料

CreateFile("\\\\.\\PhysicalDriveN",//N會帶入特定數值
GENERIC_READ,// no access to the drive
FILE_SHARE_READ/* | // share mode
FILE_SHARE_WRITE*/,
NULL, // default security attributes
OPEN_EXISTING, // disposition
FILE_FLAG_NO_BUFFERING, // file attributes
NULL);

開發軟體時是在administrator的權限下開發,所以都可以正常讀取硬碟的資料
但是當軟體在只有一般使用者權限下卻無法正常讀取硬碟

想請問是不是沒辦法在一般使用者權限下使用這個API來讀取physicaldrive的資料?修改參數有沒有用?
或是會不會有些像是編輯群組原則或安全性選項的設定可以讓使用者擁有這個權限。
...全文
180 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-08-29
  • 打赏
  • 举报
回复
参考
/*
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Copyright (C) 1998 - 2000.  Microsoft Corporation.  All rights reserved.


This code sample requires the following import library:
    advapi32.lib

Note:  This sample does not run on Windows 2000.
*/

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <accctrl.h>
#include <aclapi.h>

#define SD_SIZE (65536 + SECURITY_DESCRIPTOR_MIN_LENGTH)
#define SYSTEM_PID 2

#define PERR(s) fprintf(stderr, "%s(%d) %s : Error %d\n%s\n", \
                   __FILE__, __LINE__, (s), GetLastError(), \
         GetLastErrorText())

BOOL EnableDebugPriv(void);
BOOL ModifySecurity(HANDLE hProc, DWORD dwAccess);
LPSTR GetLastErrorText(void);


void main( int argc, char * argv[] )
{

   HANDLE hProc;
   HANDLE hToken;
   STARTUPINFO si;
   PROCESS_INFORMATION pi;
   BOOL                bResult;

   if(!EnableDebugPriv())
   {
      printf("You probably don't have the SE_DEBUG_NAME privilege\n");
      exit(0);
   }

   //
   // PID 2 is always(?) associated with the
   // "system" process which has the context we
   // are after - local system
   //
   if(!(hProc = OpenProcess(
      PROCESS_ALL_ACCESS,
      FALSE,
      SYSTEM_PID)))
   {
      PERR("OpenProcess");
      printf("You are probably not a member of the administrator group\n");
	  exit(0);
   }

   //
   // Open the process token with this access
   // so that we can modify	the	DACL and add
   // TOKEN_DUPLICATE &	TOKEN_ASSIGN_PRIMARY
   // rights for this user
   //
   bResult = OpenProcessToken(
	  hProc,
	  READ_CONTROL|WRITE_DAC,
	  &hToken);
   if (bResult == FALSE)
   {
	  PERR("OpenProcessToken");
	  exit(0);
   }

   if(!ModifySecurity(
	  hToken,
	  TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_QUERY))
   {
	  exit(0);
   }

   CloseHandle(hToken);

   //
   // Close	that handle	and	get	a new one with the right
   // privilege	level
   //

   bResult = OpenProcessToken(
	  hProc,
	  TOKEN_QUERY|TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY,
	  &hToken);
   if (FALSE ==	bResult)
   {
	  PERR("OpenProcessToken");
	  exit(0);
   }

   //
   // setup	STARTUPINFO	structure
   //
   memset( &si,	0, sizeof(STARTUPINFO) );
   si.cb = sizeof(STARTUPINFO);
   si.lpDesktop	= "winsta0\\default";

   if( !CreateProcessAsUser(
	  hToken,
	  NULL,
	  "cmd.exe",
	  NULL,	// default process attributes
	  NULL,	// default thread attributes
	  FALSE, //	don't inherit handles
	  CREATE_NEW_CONSOLE,
	  NULL,	 //	inherit	environment
	  NULL,	 //	same directory
	  &si,
	  &pi )	)

	  PERR(	"CreateProcessAsUser" );
   else
	  printf( "\"SuperUsr\" mode console started!\n" );

   CloseHandle(hProc);
   CloseHandle(hToken);

}

BOOL EnableDebugPriv(void)
{
   TOKEN_PRIVILEGES	tp;
   HANDLE hToken;
   LUID	luid;

   if(!OpenProcessToken(
	  GetCurrentProcess(),
	  TOKEN_ADJUST_PRIVILEGES,
	  &hToken ))
   {
	  PERR("OpenProcessToken");
	  return(FALSE);
   }

   if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
   {
	  PERR("LookupPrivilegeValue");
	  CloseHandle(hToken);
	  return(FALSE);
   }

   tp.PrivilegeCount		   = 1;
   tp.Privileges[0].Luid	   = luid;
   tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

   if(!AdjustTokenPrivileges(
	  hToken,
	  FALSE,
	  &tp,
	  sizeof(TOKEN_PRIVILEGES),
	  NULL,
	  NULL ))
   {
	  PERR("AdjustTokenPrivileges");
	  CloseHandle(hToken);
	  return(FALSE);
   }

   CloseHandle(hToken);

   return(TRUE);

}


BOOL ModifySecurity(HANDLE hProc, DWORD	dwAccess)
{
   UCHAR		  ucSDbuf[SD_SIZE];
   PSECURITY_DESCRIPTOR	pSD=(PSECURITY_DESCRIPTOR)ucSDbuf;
   DWORD		  dwSDLengthNeeded;

   PACL			  pAcl;
   PACL			  pNewAcl;

   EXPLICIT_ACCESS explicitaccess;

   BOOL	fDaclPresent,fDaclDefaulted;
   DWORD dwResult;

   UCHAR		  ucAbsSDbuf[SD_SIZE];
   PSECURITY_DESCRIPTOR	pAbsSD=(PSECURITY_DESCRIPTOR)ucAbsSDbuf;
   DWORD dwSDLength;

#define	ACL_SIZE 2048
#define	SID_SIZE 1024

   PACL	pacl,psacl;
   DWORD dwAclSize=ACL_SIZE, dwSaclSize=ACL_SIZE;
   PSID	pSidOwner,pSidPrimary;
   DWORD dwSidOwnLen=SID_SIZE,dwSidPrimLen=SID_SIZE;


   if(!GetKernelObjectSecurity(
	  hProc,
	  DACL_SECURITY_INFORMATION,
	  pSD,
	  SD_SIZE,
	  &dwSDLengthNeeded))
   {
	  PERR("GetKernelObjectSecurity");
	  return(FALSE);
   }

   if(!GetSecurityDescriptorDacl(
	  pSD,
	  &fDaclPresent,
	  &pAcl,
	  &fDaclDefaulted))
   {
	  PERR("GetSecurityDescriptorDacl");
	  return(FALSE);
   }


   BuildExplicitAccessWithName(
	  &explicitaccess,
	  "administrators",
	  dwAccess,
	  GRANT_ACCESS,
	  0	);

   if( dwResult	= SetEntriesInAcl(
	  1,
	  &explicitaccess,
	  pAcl,
	  &pNewAcl ) )
   {
	  SetLastError(dwResult);
	  PERR("SetEntriesInAcl");
	  return( FALSE	);
   }


   pacl	= malloc(ACL_SIZE);
   psacl = malloc(ACL_SIZE);
   pSidOwner = malloc(SID_SIZE);
   pSidPrimary = malloc(SID_SIZE);

   dwSDLength =	SD_SIZE;

   if(!MakeAbsoluteSD(
	  pSD,
	  pAbsSD,
	  &dwSDLength,
	  pacl,	&dwAclSize,
	  psacl, &dwSaclSize,
	  pSidOwner, &dwSidOwnLen,
	  pSidPrimary, &dwSidPrimLen))
   {
	  PERR("MakeAbsoluteSD");
	  return(FALSE);
   }

   if(!SetSecurityDescriptorDacl(
	  pAbsSD,
	  fDaclPresent,
	  pNewAcl,
	  fDaclDefaulted))
   {
	  PERR("SetSecurityDescriptorDacl");
	  return(FALSE);
   }

   if(!SetKernelObjectSecurity(
	  hProc,
	  DACL_SECURITY_INFORMATION,
	  pAbsSD))
   {
	  PERR("SetKernelObjectSecurity");
	  return(FALSE);
   }

   return (TRUE);
}


LPSTR GetLastErrorText()
{
   #define MAX_MSG_SIZE	256

   static char szMsgBuf[MAX_MSG_SIZE];
   DWORD dwError, dwRes;

   dwError = GetLastError ();

   dwRes = FormatMessage (
	  FORMAT_MESSAGE_FROM_SYSTEM,
	  NULL,
	  dwError,
	  MAKELANGID (LANG_ENGLISH,	SUBLANG_ENGLISH_US),
	  szMsgBuf,
	  MAX_MSG_SIZE,
	  NULL);
   if (0 ==	dwRes) {
	  fprintf(stderr, "FormatMessage failed with %d\n", GetLastError());
	  ExitProcess(EXIT_FAILURE);
   }

   return szMsgBuf;
}

jiuchang 2014-08-29
  • 打赏
  • 举报
回复
一般用户有权访问文件,就可以使用 关键是看看该用户的权限

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧