|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 7, 2004 20:27:46 Каким образом можно узнать права доступа к сетевому ресурсу? Например: Имеется ресурс \\USER\C Необходимо узнать, создан он только для чтения или имеем к нему полный доступ... Направьте на путь истинный :) |
|
|
Дата: Май 7, 2004 20:34:40 Программно? кинь туда какой-нить файл, если возвратит error значит не на полный :) |
|
|
Дата: Май 7, 2004 20:46:26 Охерительный метод проверки. А что за протокол-то? По сему шедевру я предполагаю, что NetBIOS? |
|
|
Дата: Май 7, 2004 21:58:16 Протокол не имеет значения. Если можно через NetBIOS, то через него, ежели нет, какие еще будут варианты, кроме как файл писать? :) |
|
|
Дата: Май 8, 2004 01:12:57 прошу прощения, а что UNC кроме нетбиоса кто-то ещё поддерживает? касательно прав доступа : через LSA и около с ним можно получить DACL ресурса. Потом взять свой токен, и дальше парсить токен и анализировать DACL. |
|
|
Дата: Май 8, 2004 17:21:45 · Поправил: sd2000 В качестве примера, я тебе собрал несколько процедур. Суть в следующем: Вначале, получаешь дескриптор безопасности объекта SD (в твоем случае это файл). Из него получаешь DACL. Это массив ACE-ов. Каждый ACE это некоторое правило - запретительное или разрешительное. Каждое правило имеет действие для конкретной учетной записи. Если в DACL-е нет ACE-ов, значит доступа нет ни для кого. Если в SD нулевой указатель на DACL, то доступ разрешен для всех. Для получения прав для конкретных учетных записей, нужно получить DACL и в цикле просмотреть все ACE.
.data
hHeap dd ?
SDLen dd ?
fDaclDef dd ?
DaclPresent dd ?
NameLength dd ?
DomainNameLength dd ?
Use dd ?
pAce dd ?
AclSizeInfo ACL_SIZE_INFORMATION <>
lpSidOwner dd ?
fOwnerDef dd ?
pSidGroup dd ?
fGroupDef dd ?
temp dd ?
SystemNameString db 0 ;нулевая строка (локальная машина)
FileName db 'e:\my_file.txt',0
SD db 512 dup(?)
b1 db 512 dup(?)
b2 db 512 dup(?)
.code
;------ получить дескриптор безопасности файла
invoke GetFileSecurity,\
offset FileName,\
DACL_SECURITY_INFORMATION+\
GROUP_SECURITY_INFORMATION+\
OWNER_SECURITY_INFORMATION+\
SACL_SECURITY_INFORMATION,\
offset SD,\
512,\
offset temp
.if !eax
jmp @@Exit
.endif
;------ проверка корректности дескриптора безопасности
invoke IsValidSecurityDescriptor,offset SD
.if !eax
invoke GetLastError
jmp @@Exit
.endif
;------ получение длины структуры дескриптора безопасности (если нужно)
invoke GetSecurityDescriptorLength,offset SD
mov SDLen,eax
;------ получить DACL из SD
invoke GetSecurityDescriptorDacl,\
offset SD,\ ;указатель на SD
addr DaclPresent,\ ;указ. на флаг присутствия DACL в SD
offset pDacl,\ ;указ. на структуру DACL
addr fDaclDef ;указ. на флаг, определяющий тип DACL:
;TRUE - DACL по-умолчанию,
;FALSE - DACL определяемый программно
.if !eax
invoke GetLastError
jmp @@Exit
.endif
;------ запросить память под имя учетной записи для SID владельца объекта
xor ebx,ebx
mov NameLength,ebx
mov DomainNameLength,ebx
mov Use,SidTypeUser
invoke LookupAccountSid,\
NULL,\ ;offset SystemNameString,\
pSidOwner,\
NULL,\ ;addr pNameBuf,\
addr NameLength,\
NULL,\ ;addr pDomainNameBuf
addr DomainNameLength,\
addr Use
.if !eax
invoke GetLastError
.if eax != ERROR_INSUFFICIENT_BUFFER
jmp @@Exit
.endif
.endif
;------ получить хэндл кучи
invoke GetProcessHeap
mov hHeap,eax
;------ выделить память под NameBuf
invoke HeapAlloc,hHeap,HEAP_ZERO_MEMORY,NameLength
mov pNameBuf,eax
;------ выделить память под DomainNameBuf
invoke HeapAlloc,hHeap,HEAP_ZERO_MEMORY,DomainNameLength
mov pDomainNameBuf,eax
;------ получить имя учетной записи для SID владельца объекта
invoke LookupAccountSid,
offset SystemNameString,
pSidOwner,
pNameBuf,
addr NameLength,
pDomainNameBuf,
addr DomainNameLength,
addr Use
; mov eax,Use
; mov eax,pNameBuf
; mov eax,pDomainNameBuf
;------ освободить память из под NameBuf
invoke HeapFree,hHeap,NULL,pNameBuf
;------ освободить память из под DomainNameBuf
invoke HeapFree,hHeap,NULL,pDomainNameBuf
;-------------------------------------------------------
; Получение информации из DACL
;-------------------------------------------------------
;------- получение информации из DACL
invoke GetAclInformation,
pDacl,
addr AclSizeInfo,
type(ACL_SIZE_INFORMATION),
AclSizeInformation
; mov eax,AclSizeInfo.AceCount
; mov eax,AclSizeInfo.AclBytesInUse
; mov eax,AclSizeInfo.AclBytesFree
mov NameLength,512
mov DomainNameLength,512
xor ecx,ecx
xor ebx,ebx
.while ebx<AclSizeInfo.AceCount
invoke GetAce,pDacl,ebx,addr pAce
mov esi,pAce
invoke IsValidSid,[esi].ACCESS_ALLOWED_ACE.SidStart
.if !eax
invoke GetLastError
jmp @@Exit
.endif
;------ получить учетную запись, соотв. данному SID
invoke LookupAccountSid,\
offset SystemNameString,\
esi,\
offset b1,\
addr NameLength,\
offset b2,\
addr DomainNameLength,\
addr Use ;значение SID_NAME_USE
inc ebx
.endw
@@Exit:
|
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.077 |