Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何获取文件夹的权限级别?_Delphi_Permissions_Windows 7_Administrator - Fatal编程技术网

Delphi 如何获取文件夹的权限级别?

Delphi 如何获取文件夹的权限级别?,delphi,permissions,windows-7,administrator,Delphi,Permissions,Windows 7,Administrator,我想检测一个文件夹,如果需要使用Delphi的管理员权限级别。可能吗 我写了这段代码。这正是我想要的。但我想使用Windows标准函数来实现这一点 // Check if You need Administrator-level access to create a folder try mkdir(SDirectory + '\~TEST'); except on E: exception do begin if E.message = 'File access denie

我想检测一个文件夹,如果需要使用Delphi的管理员权限级别。可能吗

我写了这段代码。这正是我想要的。但我想使用Windows标准函数来实现这一点

// Check if You need Administrator-level access to create a folder
try
  mkdir(SDirectory + '\~TEST');
except
  on E: exception do
  begin
    if E.message = 'File access denied' then
    begin
      MessageBox(self.Handle,
        'You need Administrator-level access to create this folder', '', MB_ICONERROR);
      exit;
    end;
  end;
end;
RmDir(SDirectory + '\~TEST');

下面的例子是从。它可以用于确定文件或目录是否具有中为每个用户指定的访问权限,因此,如果我请求文件\u ALL\u访问,则意味着每个人都可以完全访问所需的文件或目录。请注意,在下面的代码中没有异常处理,我甚至记不起上次使用VB的时间,所以可能是错误的,所以请将此作为灵感,随意修改此帖子

const
  FILE_READ_DATA = $0001;
  FILE_WRITE_DATA = $0002;
  FILE_APPEND_DATA = $0004;
  FILE_READ_EA = $0008;
  FILE_WRITE_EA = $0010;
  FILE_EXECUTE = $0020;
  FILE_READ_ATTRIBUTES = $0080;
  FILE_WRITE_ATTRIBUTES = $0100;
  FILE_GENERIC_READ = (STANDARD_RIGHTS_READ or FILE_READ_DATA or
    FILE_READ_ATTRIBUTES or FILE_READ_EA or SYNCHRONIZE);
  FILE_GENERIC_WRITE = (STANDARD_RIGHTS_WRITE or FILE_WRITE_DATA or
    FILE_WRITE_ATTRIBUTES or FILE_WRITE_EA or FILE_APPEND_DATA or SYNCHRONIZE);
  FILE_GENERIC_EXECUTE = (STANDARD_RIGHTS_EXECUTE or FILE_READ_ATTRIBUTES or
    FILE_EXECUTE or SYNCHRONIZE);
  FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $1FF;

function CheckFileAccess(const FileName: string; const CheckedAccess: Cardinal): Cardinal;
var Token: Cardinal;
    Status: LongBool;
    Access: Cardinal;
    SecDescSize: Cardinal;
    PrivSetSize: Cardinal;
    PrivSet: PRIVILEGE_SET;
    Mapping: GENERIC_MAPPING;
    SecDesc: PSECURITY_DESCRIPTOR;
begin
  Result := 0;
  GetFileSecurity(PChar(Filename), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, nil, 0, SecDescSize);
  SecDesc := GetMemory(SecDescSize);

  if GetFileSecurity(PChar(Filename), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, SecDesc, SecDescSize, SecDescSize) then
  begin
    ImpersonateSelf(SecurityImpersonation);
    OpenThreadToken(GetCurrentThread, TOKEN_QUERY, False, Token);
    if Token <> 0 then
    begin
      Mapping.GenericRead := FILE_GENERIC_READ;
      Mapping.GenericWrite := FILE_GENERIC_WRITE;
      Mapping.GenericExecute := FILE_GENERIC_EXECUTE;
      Mapping.GenericAll := FILE_ALL_ACCESS;

      MapGenericMask(Access, Mapping);
      PrivSetSize := SizeOf(PrivSet);
      AccessCheck(SecDesc, Token, CheckedAccess, Mapping, PrivSet, PrivSetSize, Access, Status);
      CloseHandle(Token);
      if Status then
        Result := Access;
    end;
  end;

  FreeMem(SecDesc, SecDescSize);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if CheckFileAccess('C:\Windows', FILE_ALL_ACCESS) = FILE_ALL_ACCESS then
    ShowMessage('C:\Windows has full access for everyone')
  else
    ShowMessage('Someone has no full access to C:\Windows');
end;
在64位Windows 7 Enterprise SP 1上使用Delphi 2007


无论如何,更容易的方法是下载并遵循这个示例,就像我希望它也适用于目录一样,但我非常确定它会起作用。

下面的示例是从中翻译过来的。它可以用于确定文件或目录是否具有中为每个用户指定的访问权限,因此,如果我请求文件\u ALL\u访问,则意味着每个人都可以完全访问所需的文件或目录。请注意,在下面的代码中没有异常处理,我甚至记不起上次使用VB的时间,所以可能是错误的,所以请将此作为灵感,随意修改此帖子

const
  FILE_READ_DATA = $0001;
  FILE_WRITE_DATA = $0002;
  FILE_APPEND_DATA = $0004;
  FILE_READ_EA = $0008;
  FILE_WRITE_EA = $0010;
  FILE_EXECUTE = $0020;
  FILE_READ_ATTRIBUTES = $0080;
  FILE_WRITE_ATTRIBUTES = $0100;
  FILE_GENERIC_READ = (STANDARD_RIGHTS_READ or FILE_READ_DATA or
    FILE_READ_ATTRIBUTES or FILE_READ_EA or SYNCHRONIZE);
  FILE_GENERIC_WRITE = (STANDARD_RIGHTS_WRITE or FILE_WRITE_DATA or
    FILE_WRITE_ATTRIBUTES or FILE_WRITE_EA or FILE_APPEND_DATA or SYNCHRONIZE);
  FILE_GENERIC_EXECUTE = (STANDARD_RIGHTS_EXECUTE or FILE_READ_ATTRIBUTES or
    FILE_EXECUTE or SYNCHRONIZE);
  FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $1FF;

function CheckFileAccess(const FileName: string; const CheckedAccess: Cardinal): Cardinal;
var Token: Cardinal;
    Status: LongBool;
    Access: Cardinal;
    SecDescSize: Cardinal;
    PrivSetSize: Cardinal;
    PrivSet: PRIVILEGE_SET;
    Mapping: GENERIC_MAPPING;
    SecDesc: PSECURITY_DESCRIPTOR;
begin
  Result := 0;
  GetFileSecurity(PChar(Filename), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, nil, 0, SecDescSize);
  SecDesc := GetMemory(SecDescSize);

  if GetFileSecurity(PChar(Filename), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, SecDesc, SecDescSize, SecDescSize) then
  begin
    ImpersonateSelf(SecurityImpersonation);
    OpenThreadToken(GetCurrentThread, TOKEN_QUERY, False, Token);
    if Token <> 0 then
    begin
      Mapping.GenericRead := FILE_GENERIC_READ;
      Mapping.GenericWrite := FILE_GENERIC_WRITE;
      Mapping.GenericExecute := FILE_GENERIC_EXECUTE;
      Mapping.GenericAll := FILE_ALL_ACCESS;

      MapGenericMask(Access, Mapping);
      PrivSetSize := SizeOf(PrivSet);
      AccessCheck(SecDesc, Token, CheckedAccess, Mapping, PrivSet, PrivSetSize, Access, Status);
      CloseHandle(Token);
      if Status then
        Result := Access;
    end;
  end;

  FreeMem(SecDesc, SecDescSize);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if CheckFileAccess('C:\Windows', FILE_ALL_ACCESS) = FILE_ALL_ACCESS then
    ShowMessage('C:\Windows has full access for everyone')
  else
    ShowMessage('Someone has no full access to C:\Windows');
end;
在64位Windows 7 Enterprise SP 1上使用Delphi 2007


无论如何,更容易的方法是下载并遵循这个示例,就像我希望它也适用于目录一样,但我很确定它也适用于目录。

对于上面的示例,对于那些已经迁移到Delphi XE2和up Token不再适用于Cardinal的人来说,这个小改动必须是THandle

function getFileAccess(...):Cardinal;
var
    Token: THandle;//No longer Cardinal
begin
    { ... code ...}
    if GetFileSecurity({...params...}) then
    begin
        //... more stuff
        OpenThreadToken(GetCurrentThread,TOKEN_QUERY,false,Token);
        if Token<>0 then
        begin
            //... more stuff
            AccessCheck(SecDesc,Token,CheckedAccess,Mapping,PrivSet,PrivSetSize,Access,Status);
            CloseHandle(Token);
            //... more stuff
        end;
    end;
    //....more stuff
end;

对于那些已经迁移到Delphi XE2并且up Token不再与Cardinal一起工作的人来说,上面示例中的小改动必须是THandle

function getFileAccess(...):Cardinal;
var
    Token: THandle;//No longer Cardinal
begin
    { ... code ...}
    if GetFileSecurity({...params...}) then
    begin
        //... more stuff
        OpenThreadToken(GetCurrentThread,TOKEN_QUERY,false,Token);
        if Token<>0 then
        begin
            //... more stuff
            AccessCheck(SecDesc,Token,CheckedAccess,Mapping,PrivSet,PrivSetSize,Access,Status);
            CloseHandle(Token);
            //... more stuff
        end;
    end;
    //....more stuff
end;

为什么投票被否决?我的问题有什么问题吗?请帮我解决这个问题:这个问题没有答案。这太不精确了。需要管理员权限级别做什么?阅读?写作?删除?等等你能解释一下为什么你需要检测这个,因为可能有更好的解决方案。我想这在非英语操作系统上会失败。最好测试GetLastError=ERROR\u ACCESS\u DENIED。您如何理解需要管理员权限的结论?失败可能还有其他原因。您必须使用GetFileSecurity函数来检索有关目录安全性的信息。为什么要投否决票?我的问题有什么问题吗?请帮我解决这个问题:这个问题没有答案。这太不精确了。需要管理员权限级别做什么?阅读?写作?删除?等等你能解释一下为什么你需要检测这个,因为可能有更好的解决方案。我想这在非英语操作系统上会失败。最好测试GetLastError=ERROR\u ACCESS\u DENIED。您如何理解需要管理员权限的结论?失败可能还有其他原因。必须使用GetFileSecurity函数检索有关目录安全性的信息