· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.NETWORKS —› Права доступа к сетевому ресурсу

Посл.отвђт Сообщен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