【问题标题】:How can I get effective file permissions?如何获得有效的文件权限?
【发布时间】:2018-08-31 21:41:05
【问题描述】:

我正在尝试获取文件有效权限。最好的方法是什么?

我正在尝试使用win32security,但GetEffectiveRightsFromAcl(trustee) 函数需要PyTRUSTEE 参数。而且我不知道如何正确设置。

因此,我需要获得与在 PowerShell 中调用 Get-EffectiveAccess 相同的权限。

我们曾尝试使用 Authz.h,但在这种情况下,我们在 Windows 事件查看器中遇到了审核失败。

我们也尝试使用Aclapi.h 中的GetEffectiveRightsFromAcl,但如果我们有很多文件,它可能会成为服务器挂起的原因。

蟒蛇:

dacl = win32security.GetNamedSecurityInfo( FILENAME,
 win32security.SE_FILE_OBJECT,
 win32security.DACL_SECURITY_INFORMATION).GetSecurityDescriptorDacl()
mask = dacl.GetEffectiveRightsFromAcl( ??? )

Authz.h

AuthzInitializeResourceManager(AUTHZ_RM_FLAG_NO_AUDIT, NULL, NULL, NULL, NULL, &hManager);
AuthzInitializeContextFromSid(0, psid, hManager, NULL, unusedId, NULL, &hAuthzClientContext);
AuthzFreeResourceManager(hManager);

accessRequest->DesiredAccess = MAXIMUM_ALLOWED;
accessRequest->PrincipalSelfSid = NULL;
accessRequest->ObjectTypeList = NULL;
accessRequest->ObjectTypeListLength = 0;
accessRequest->OptionalArguments = NULL;
RtlZeroMemory(Buffer, sizeof(Buffer));
accessReply->ResultListLength = 1;

accessReply->GrantedAccessMask = (PACCESS_MASK)LocalAlloc(LPTR, sizeof(ACCESS_MASK));
accessReply->Error = (PDWORD)(Buffer + sizeof(ACCESS_MASK));

AuthzAccessCheck(0, hAuthzClient, accessRequest, NULL, psd, NULL, 0, accessReply, NULL)

Aclapi.h

ACCESS_MASK accessRights;
TRUSTEE trustee;

BuildTrusteeWithName(&trustee, trav->user);
retcode = GetEffectiveRightsFromAcl( acl,&trustee,&accessRights);

我需要得到类似的东西:

FILE_READ_DATA
FILE_WRITE_DATA
FILE_APPEND_DATA
FILE_READ_EA
FILE_WRITE_EA
FILE_EXECUTE
FILE_DELETE_CHILD
FILE_READ_ATTRIBUTE
FILE_WRITE_ATTRIBUTE
删除
READ_CONTROL
WRITE_DAC
WRITE_OWNER
同步

【问题讨论】:

  • 向我们展示您的代码
  • 您是想向用户显示此信息,还是想了解您是否可以对文件执行某些操作?在后一种情况下,不要打扰;尝试实际操作,看看是否失败。
  • 作为不同的用户,您将如何做某事以查看它是否失败。如果没有密码,我当然不能表现得好像我是一个不同的用户。我想不出任何我想检查我自己帐户的有效权利的例子,因为正如你所说,我只是尝试做任何我想知道的事情,如果我有权利做。
  • 我需要获取所有用户的所有文件权限(FILE_READ_DATA、FILE_WRITE_DATA、FILE_APPEND_DATA、...)的完整信息。
  • 以下为当前进程启用备份权限,如果它在令牌中可用:se_backup_value = win32security.LookupPrivilegeValue(None, win32security.SE_BACKUP_NAME);htoken = win32security.OpenProcessToken(win32api.GetCurrentProcess(), win32security.TOKEN_QUERY | win32security.TOKEN_ADJUST_PRIVILEGES);prev_state = win32security.AdjustTokenPrivileges(htoken, False, [(se_backup_value, win32security.SE_PRIVILEGE_ENABLED)])。通常,最好将其更改为模拟自我并仅为当前线程启用此权限。

标签: python c windows file-permissions


【解决方案1】:

我使用@eryksun 帮助得到了一些结果。谢谢。 我还找到了this useful example

def print_permissions(mask):
print("PERMISSION:",
      1 if bool(mask & 0x00000001) else 0,
      1 if bool(mask & 0x00000002) else 0,
      1 if bool(mask & 0x00000004) else 0,
      1 if bool(mask & 0x00000008) else 0,
      1 if bool(mask & 0x00000010) else 0,
      1 if bool(mask & 0x00000020) else 0,
      1 if bool(mask & 0x00000040) else 0,
      1 if bool(mask & 0x00000080) else 0,
      1 if bool(mask & 0x00000100) else 0,
      1 if bool(mask & 0x00010000) else 0,
      1 if bool(mask & 0x00020000) else 0,
      1 if bool(mask & 0x00040000) else 0,
      1 if bool(mask & 0x00080000) else 0,
      1 if bool(mask & 0x00100000) else 0)

def get_permissions(dacl):
for n_ace in range(dacl.GetAceCount()):
    ace = dacl.GetAce(n_ace)
    (ace_type, ace_flags) = ace[0]
    if ace_type in CONVENTIONAL_ACES:
        mask, sid = ace[1:]
    else:
        mask, object_type, inherited_object_type, sid = ace[1:]
    name, domain, type = win32security.LookupAccountSid(None, sid)
    print("\nUSER:", name)
    print_permissions(mask)

for f in files:
    try:
        dacl = win32security.GetNamedSecurityInfo(
            f,
            win32security.SE_FILE_OBJECT,
            win32security.DACL_SECURITY_INFORMATION).GetSecurityDescriptorDacl()
    except BaseException as ex:
        winerror, funcname, strerror = ex.args
        print("Error: ", winerror,"\n")
    else:
        get_permissions(dacl)

我不使用GetEffectiveRightsFromAcl,因为它包含在 ace 中。

当我尝试使用特权常量创建令牌时,我也得到了相同的 Audit Failure(在系统帐户情况下)。因此,在这两种情况下(系统帐户和管理员)(PowerShell 除外),我都没有找到任何没有Audit Faulire 的结果。

【讨论】:

    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多