Registry

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Registry

Сообщение GSerg » 13.09.2004 (Пн) 20:18

Переработал, баги пофиксил, какие нашёл (а нашёл...), требуемые права доступа снизил до плинтуса... Вроде поддерживает все фичи, но бета-тестинг не помешает :)
Планирую ещё ввести процедурины типа SetSecurity, но это после создания модуля modSecurity (есть такое в планах :)) для папочки Include...

Зацениваем, высказываемся...
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось GSerg 24.09.2004 (Пт) 21:08, всего редактировалось 2 раз(а).
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Tarik
Агент Системы
Агент Системы
Аватара пользователя
 
Сообщения: 1222
Зарегистрирован: 03.01.2003 (Пт) 16:05
Откуда: Москва

Сообщение Tarik » 13.09.2004 (Пн) 20:29

Ну, GSerg, как всегда, на высоте :thumleft: Завтра вот ещё копну поглубже и разверну полномасштабное тестирование :)
Изображение

Ever tried? Ever failed? No matter. Try again! Fail again! Fail better!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.09.2004 (Вт) 9:04

Поглядел по диагонали - симпатично, даже очень :) Вот только для нормальной "заценки" времени нет...
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.09.2004 (Пт) 19:56

И что интересно - подвизался и молчит...
"Завтра" было две недели назад! :) Где выводы о наличии багов?

Вот, с alibek'а бери пример! Сразу всё ясно :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.09.2004 (Пт) 20:02

GSerg писал(а):И что интересно - подвизался и молчит...
"Завтра" было две недели назад! :) Где выводы о наличии багов?

Так ведь полторы, откуда две-то?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.09.2004 (Пт) 20:04

Ведь придрался же, придрался...
Ведь знал же...
Нет чтоб поделить и вывести точную дробь количества прошедших дней...
Вот всегда я так...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Tarik
Агент Системы
Агент Системы
Аватара пользователя
 
Сообщения: 1222
Зарегистрирован: 03.01.2003 (Пт) 16:05
Откуда: Москва

Сообщение Tarik » 24.09.2004 (Пт) 20:45

GSerg, извини :oops: Просто мы в универе начали Delphi изучать (ну надо же, какая неожиданность! :) Я-то думал VB будет :) ), поэтому пришлось всё бросить и разбираться. Не люблю Delphi. :evil: Так же, как и Паскаль. ИМХО синтаксис совсем не наглядный, не то что в Basic. Токи-с-запятой опять же... В общем, бяка :)
Так, теперь по существу.

1. Ф-ция Exists почему-то всегда возвращает False, если не указывать имя параметра.
'Если передано имя параметра, проверяем наличие параметра
'Если не передано, то наличие всего раздела

С параметром всё в порядке - определяет исправно. А вот с разделами - ни в какую :(
2. Насчёт ф-ции ValueType: Там можно опустить параметр ValueName. Но тогда что она должна вернуть? Ведь определяется тип параметра :? При опущенном имени параметра выдаёт ошибку "Не удаётся найти указанный файл".

Всё остальное вроде работает... Если что вдруг пропустил - извиняйте, время штука такая...
Изображение

Ever tried? Ever failed? No matter. Try again! Fail again! Fail better!

Tarik
Агент Системы
Агент Системы
Аватара пользователя
 
Сообщения: 1222
Зарегистрирован: 03.01.2003 (Пт) 16:05
Откуда: Москва

Сообщение Tarik » 24.09.2004 (Пт) 20:47

Кстати, чисто эстетическое пожелание: было бы неплохо в начале модуля сделать краткий список ф-ций с их описанием :wink:
Изображение

Ever tried? Ever failed? No matter. Try again! Fail again! Fail better!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.09.2004 (Пт) 21:06

  1. Глупейший баг :) В проверке условия If Len(ValueName) поток выполнения был направлен мною в прямо противоположном направлении :). Исправляется путём изменения на If Len(ValueName) = 0. Fixed.
  2. Чуть более тонкий баг. Пришлось покопаться. Докопался :)
    Оказывается, в Win98 и ниже у каждого раздела в обязательном порядке существует «Значение по умолчанию», содержащее... ни фига не содержащее, нулевой длины оно - именно его тип пытается определить код, если имя Value не передано. На начиная с 2k наличие значения по умолчанию стало необязательным, и до первого задания его просто не существует (хотя подлый RegEdit всегда его отображает).
    Теперь в таком случае будет возвращаться REG_NONE. Fixed.


Что касается Дельфи, то она мне тоже нравится :)

Что касается списка функций, то, ИМХО, их имена достаточно красноречивы :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.09.2004 (Пт) 21:18

Только не говорите, что больше багов нет :?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.09.2004 (Пт) 22:05

GSerg писал(а):Чуть более тонкий баг. Пришлось покопаться. Докопался :)
Оказывается, в Win98 и ниже у каждого раздела в обязательном порядке существует «Значение по умолчанию», содержащее... ни фига не содержащее, нулевой длины оно - именно его тип пытается определить код, если имя Value не передано. На начиная с 2k наличие значения по умолчанию стало необязательным, и до первого задания его просто не существует (хотя подлый RegEdit всегда его отображает).

Во-первых, RegEdit не подлый, а предельно корректный: если значения по умолчанию в ключе нету, он пишет "(значение не присвоено)" (а если оно пустое - то пустую строку).
Во-вторых, здесь скрыт глубокий смысл: в реестре Win3x были только значения по умолчанию, именованных значений не было. В Win9x и RegEdit-е они сохранены для совместимости.
А вообще, юзайте RedEdt32: он не показывает значение по умолчанию, если его нету; поддерживает удалённые реестры и разрешения ключей; поддерживает тип REG_MULTI_SZ; ну и так далее.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.09.2004 (Пт) 22:10

tyomitch писал(а):Во-первых, RegEdit не подлый, а предельно корректный: если значения по умолчанию в ключе нету, он пишет "(значение не присвоено)" (а если оно пустое - то пустую строку).

Дело в том, что под 98 "Значение не присвоено" означало "Оно есть, но пустое". А теперь оно означает "Нету вообще". Меня это сбило :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.01.2005 (Сб) 7:49

О! Слушай!
GSerg, твой модуль может менять права на ключи реестра?
Мне это внезапно стало очень надо. Первым делом полез в гугл, вторым - в этот топик.

Беглый взгляд сквозь модуль говорит, что нет. А как на самом деле?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.01.2005 (Сб) 9:01

Ты прям читаешь мои мысли :)

Видишь ли, у меня в рамках наполеоновских планов есть создание модуля modSecurity. Он уже немного есть, но пока способен только отображать привилегии, которыми обладает процесс, добавлять, удалять, включать и выключать их... Вот. А делать там ещё до фига :)

Если тебе нужно прям срочно зафигачить ACL'ы, то лучше всего наверное будете тебе читать про славную функцию ConvertStringSecurityDescriptorToSecurityDescriptor. Там и язык создания ACL приводится...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.01.2005 (Сб) 12:02

Эх... Начал читать про NT Access Control - там столько всего, что прям глаза разбегаются. Нет ли где-нибудь какого-нибудь краткого обзора, в духе RSDN-овских статей?

Кстати, красивое окошко с пользователями и правами как вывести? Оно ведь, похоже, стандартное?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.01.2005 (Сб) 12:17

Не знаю что там где, но попытаюсь для тебя скомпилировать из головы :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.01.2005 (Сб) 12:27

Итак, для ряда именованных объектов на nt-виндах существует понятие авторизации, то есть проверки наличия у пользователя прав сделать с объектом то, что он намеревается. Механизм авторизации базируется на понятии ACL: Access Control List. Это список, каждый элемент которого - ACE, Access Control Entry. Одна Entry определяет набор разрешений для одного пользователя или группы пользователей. Например: Юзерам разрешить чтение. Или Админам запретить запись (гы :)).
Кроме ACL, у объекта есть понятие владельца - это тот, кто создал объект. Владелец всегда имеет полный доступ к объекту, вне зависимости от того, что повествует ACL. При этом этот самый владелец может быть измененён, но для этого нужно открыть объект с доступом WRITE_OWNER.

Когда система получает от некоего приложения запрос на такой-то доступ к объекту, то проверяется, в качестве кого запущен запрашивающий процесс. В качестве Гостя, к примеру. После чего сканируется ACL объекта, причём сверху вниз. Как только будет встречена запись, касающаяся требуемого действия, просителю будет дано то, что в этой записи записано :) Иными словами, если сначала в ACL идёт ACE, разрешающий всё гостям, а сразу за ним ACE, запрещающий всё гостям, то гости будут иметь всё, ибо первый ACE выигрывает. По этой причине мелкософт официально рекомендует ставить все запретительные ACE перед всеми разрешительными.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.01.2005 (Сб) 12:41

Ок. Возникшие вопросы:
- правильно ли я понял, что в красивом окошечке отображается один ACL, а каждая строчка - это ACE? Почему там тогда нету возможности переупорядочить ACE-ы - только добавлять/удалять?
- что такое "Аудит"? Это ведь тоже имеет отношение к AC? А также DACL и другие страшные слова.
- какой-нибудь простенький сэмпл делания чего угодно с правами хотелось бы...
Последний раз редактировалось tyomitch 15.01.2005 (Сб) 12:54, всего редактировалось 1 раз.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.01.2005 (Сб) 12:52

tyomitch писал(а):Кстати, красивое окошко с пользователями и правами как вывести? Оно ведь, похоже, стандартное?

Нашёл - EditSecurity. Вещь в себе ещё та...
Примеры её использования в VB гуглу неизвестны :-(
Может, буду первым :-)
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.01.2005 (Сб) 12:55

- Да. А упорядочивание записей все встроенные тулзы производят автоматически, запреты перед разрешениями.
- Это отслеживание обращения к защищённым объектам. Система ведёт журнал, в который записывает обломы доступа. Это позволяет выявить всякий нехороший софт, который чё-то там пытается поиметь... DACL и ACL, по идее, одно и то же.... Хотя нет... DACL - это дискретный ACL, он и определяет права доступа. А SACL относится как раз к аудиту, но в этом я разбираюсь гораздо хуже...
- даже простейший пример - страшный гемор... Я ещё не пытался в реале, только читал :) Неужто нету sample code в MSDN?..
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.01.2005 (Вс) 10:47

GSerg писал(а):- даже простейший пример - страшный гемор... Я ещё не пытался в реале, только читал :) Неужто нету sample code в MSDN?..

для aclui - нету :развожу руками:
и гуглом найти не могу... Эх, придётся методом тыка...
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.01.2005 (Пн) 8:02

Кто-нибудь, помогите!
Покажите хоть один пример имплементации ISecurityInformation, на любом языке.
Из документации вообще ничерта не понятно, что надо делать :-(
Гугл не помог :-((
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.01.2005 (Пн) 8:35

Возвращаясь к теме "Registry": - вот этот код, похоже, делает что мне нужно.
Внутрь я внимательно не смотрел, за что купил - за то продаю :-)
Может, кому-то пригодится; и может, GSerg даже добавит его в свой модуль ;-)
Код: Выделить всё
'#VBIDEUtils#************************************************************
' * Programmer Name : Waty Thierry
' * Web Site         : www.geocities.com/ResearchTriangle/6311/
' * E-Mail           : waty.thie...@usa.net
' * Date             : 1/03/99
' * Time             : 13:11
' **********************************************************************
' * Comments         : Change the permissions on files
' *
' *
' **********************************************************************


Option Explicit


Public LastError              As Long
Public LastErrorMsg           As String


Enum ACCESS_MODE
  NOT_USED_ACCESS = 0
  GRANT_ACCESS
  SET_ACCESS
  DENY_ACCESS
  REVOKE_ACCESS
  SET_AUDIT_SUCCESS
  SET_AUDIT_FAILURE
End Enum


Enum SE_OBJECT_TYPE
  SE_UNKNOWN_OBJECT_TYPE = 0&
  SE_FILE_OBJECT
  SE_SERVICE
  SE_PRINTER
  SE_REGISTRY_KEY
  SE_LMSHARE
  SE_KERNEL_OBJECT
  SE_WINDOW_OBJECT
  'SE_DS_OBJECT
  'SE_DS_OBJECT_ALL
  'SE_PROVIDER_DEFINED_OBJECT
End Enum

Enum MULTIPLE_TRUSTEE_OPERATION
  NO_MULTIPLE_TRUSTEE
  TRUSTEE_IS_IMPERSONATE
End Enum


Enum TRUSTEE_FORM
  TRUSTEE_IS_SID
  TRUSTEE_IS_NAME
End Enum


Enum TRUSTEE_TYPE
  TRUSTEE_IS_UNKNOWN
  TRUSTEE_IS_USER
  TRUSTEE_IS_GROUP
End Enum


Type TRUSTEE
  pMultipleTrustee            As Long
  MultipleTrusteeOperation    As MULTIPLE_TRUSTEE_OPERATION
  TrusteeForm                 As TRUSTEE_FORM
  TrusteeType                 As TRUSTEE_TYPE
  ptstrName                   As String
End Type


Type EXPLICIT_ACCESS
  grfAccessPermissions        As Long
  grfAccessMode               As ACCESS_MODE
  grfInheritance              As Long
  TRUSTEE                     As TRUSTEE
End Type


Type AceArray
  List() As EXPLICIT_ACCESS
End Type


Public Const OWNER_SECURITY_INFORMATION = &H1
Public Const GROUP_SECURITY_INFORMATION = &H2
Public Const DACL_SECURITY_INFORMATION = &H4
Public Const SACL_SECURITY_INFORMATION = &H8


'Generic AccessRights
Public Const GENERIC_READ = &H80000000
Public Const GENERIC_WRITE = &H40000000
Public Const GENERIC_EXECUTE = &H20000000
Public Const GENERIC_ALL = &H10000000


'Common AccessRights combinations
Public Const COMMON_ADD = &H1201B6
Public Const COMMON_ADD_READ = &H1201BF
Public Const COMMON_READ = &H1200A9
Public Const COMMON_CHANGE = &H1301BF
Public Const COMMON_FULL_CONTROL = GENERIC_ALL
Public Const COMMON_ALL = &H1F01FF


'Inheritance flags
Public Const NO_INHERITANCE = &H0
Public Const OBJECT_INHERIT_ACE = &H1
Public Const CONTAINER_INHERIT_ACE = &H2


Public Const NO_PROPAGATE_INHERIT_ACE = &H4
Public Const INHERIT_ONLY_ACE = &H8
Public Const INHERITED_ACE = &H10
Public Const VALID_INHERIT_FLAGS = &H1F

Declare Function GetNamedSecurityInfo Lib "advapi32.dll" Alias "GetNamedSecurityInfoA" ( _
  ByVal pObjectName As String, _
  ByVal ObjectType As SE_OBJECT_TYPE, _
  ByVal SecurityInfo As Long, _
  ppsidOwner As Long, _
  ppsidGroup As Long, _
  ppDacl As Long, _
  ppSacl As Long, _
  ppSecurityDescriptor As Long) As Long


Declare Sub BuildExplicitAccessWithName Lib "advapi32.dll" Alias "BuildExplicitAccessWithNameA" ( _
  pExplicitAccess As EXPLICIT_ACCESS, _
  ByVal pTrusteeName As String, _
  ByVal AccessPermissions As Long, _
  ByVal AccessMode As ACCESS_MODE, _
  ByVal Inheritance As Long)


Declare Function SetEntriesInAcl Lib "advapi32.dll" Alias "SetEntriesInAclA" ( _
  ByVal cCountOfExplicitEntries As Long, _
  pListOfExplicitEntries As EXPLICIT_ACCESS, _
  ByVal OldAcl As Long, _
  NewAcl As Long) As Long


Declare Function SetNamedSecurityInfo Lib "advapi32.dll" Alias "SetNamedSecurityInfoA" ( _
  ByVal pObjectName As String, _
  ByVal ObjectType As SE_OBJECT_TYPE, _
  ByVal SecurityInfo As Long, _
  psidOwner As Long, _
  psidGroup As Long, _
  ByVal pDACL As Long, _
  pSacl As Long) As Long


Declare Function GetExplicitEntriesFromAcl Lib "advapi32.dll" Alias "GetExplicitEntriesFromAclA" ( _
  ByVal pacl As Long, _
  pcCountOfExplicitEntries As Long, _
  pListOfExplicitEntries As Long) As Long


Private Declare Function LocalFree Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function GetLastError Lib "kernel32.dll" () As Long
Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (Destination As Any, ByVal Length As Long)
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Retval As Long, ByVal Ptr As Long, ByVal nCharCount As Long)
Private Declare Function CopyMemory Lib "kernel32" Alias "lstrcpynW" (Retval As Long, ByVal Ptr As Long, ByVal nCharCount As Long) As Long
Private Declare Function PtrToStrA Lib "kernel32" Alias "lstrcpyA" (ByVal Retval As String, ByVal Ptr As Long) As Long
Private Declare Function StrLen Lib "kernel32" Alias "lstrlenW" (ByVal Ptr As Long) As Long


Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" _
  (ByVal dwFlags As Long, lpSource As Any, _
  ByVal dwMessageId As Long, ByVal dwLanguageId As Long, _
  ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long



Public Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100
Public Const FORMAT_MESSAGE_ARGUMENT_ARRAY = &H2000
Public Const FORMAT_MESSAGE_FROM_HMODULE = &H800
Public Const FORMAT_MESSAGE_FROM_STRING = &H400
Public Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Public Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200
Public Const FORMAT_MESSAGE_MAX_WIDTH_MASK = &HFF
Public Const LANG_USER_DEFAULT = &H400&
Function AccessRights(ByVal grfAccessMode As Long, ByVal grfAccessPermissions As Long)


  If grfAccessPermissions = COMMON_FULL_CONTROL Then
     If grfAccessMode <> DENY_ACCESS Then
        AccessRights = "Full Control"
     Else
        AccessRights = "None"
     End If
     Exit Function
  End If


  If grfAccessPermissions = COMMON_ALL Then
     If grfAccessMode <> DENY_ACCESS Then
        AccessRights = "All"
     Else
        AccessRights = "None"
     End If
     Exit Function
  End If


  If grfAccessPermissions = COMMON_ADD Then
     AccessRights = "Add "
     Exit Function
  End If


  If grfAccessPermissions = COMMON_ADD_READ Then
     AccessRights = "Add & Read"
     Exit Function
  End If


  If grfAccessPermissions = COMMON_CHANGE Then
     AccessRights = "Change"
     Exit Function
  End If


  If grfAccessPermissions = COMMON_READ Then
     AccessRights = "Read"
     Exit Function
  End If


End Function


Function AddAccessControlElement(ByVal lpObjectName, ByVal ObjectType As SE_OBJECT_TYPE, ByVal TrusteeName As String, ByVal AccessPermissions As Long, ByVal AccessMode As ACCESS_MODE) As Boolean
  Dim dwRes               As Long
  Dim pOldDACL            As Long
  Dim pNewDACL            As Long
  Dim pSD                 As Long
  Dim ExplicitAccess      As EXPLICIT_ACCESS
  Dim ea                  As EXPLICIT_ACCESS
  Dim I                   As Integer


  If lpObjectName = Empty Then
     AddAccessControlElement = False
     Exit Function
  End If


  ' *** Get a pointer to the existing DACL
  dwRes = GetNamedSecurityInfo(lpObjectName, ObjectType, _
     DACL_SECURITY_INFORMATION, _
     0&, 0&, pOldDACL, 0&, pSD)


  If dwRes <> 0 Then
     Call SetError(dwRes)
     AddAccessControlElement = False
     Exit Function
  End If


  ' *** Initialize an EXPLICIT_ACCESS structure to allow access
  Call ZeroMemory(ea, Len(ea))
  Call BuildExplicitAccessWithName(ea, TrusteeName & vbNullChar, AccessPermissions, _
     AccessMode, NO_INHERITANCE)


  ' *** Create a new ACL by merging the EXPLICIT_ACCESS structure
  ' *** with the existing DACL
  dwRes = SetEntriesInAcl(1, ea, pOldDACL, pNewDACL)
  If dwRes <> 0 Then
     Call SetError(dwRes)
     AddAccessControlElement = False
     Exit Function
  End If


  ' *** Attach the new ACL as the object's DACL
  dwRes = SetNamedSecurityInfo(lpObjectName, ObjectType, _
     DACL_SECURITY_INFORMATION, _
     0&, 0&, pNewDACL, 0&)


  If dwRes <> 0 Then
     Call SetError(dwRes)
     AddAccessControlElement = False
     Exit Function
  End If


  AddAccessControlElement = True


  If pSD <> 0 Then dwRes = LocalFree(pSD)
  If pNewDACL <> 0 Then dwRes = LocalFree(pNewDACL)


End Function


Function GetAccessControlElements(ByVal lpObjectName, ByVal ObjectType As SE_OBJECT_TYPE) As AceArray
  Dim dwRes                     As Long
  Dim pDACL                     As Long
  Dim pSD                       As Long
  Dim ExplicitAccess            As EXPLICIT_ACCESS
  Dim pcCountOfExplicitEntries  As Long
  Dim pListOfExplicitEntries    As Long
  Dim ACE()                     As Long
  Dim I                         As Integer


  If lpObjectName = Empty Then Exit Function


  ' *** Get a pointer to the existing DACL
  dwRes = GetNamedSecurityInfo(lpObjectName, ObjectType, _
     DACL_SECURITY_INFORMATION, _
     0&, 0&, pDACL, 0&, pSD)


  If dwRes <> 0 Then Call SetError(dwRes): Exit Function


  ' *** Retrieve an array of EXPLICIT_ACCESS structures from the ACL
  dwRes = GetExplicitEntriesFromAcl(pDACL, pcCountOfExplicitEntries, pListOfExplicitEntries)


   dwRes = Val("&H" & Right$(Hex$(dwRes), 4))
  If dwRes <> 0 Then Call SetError(dwRes): Exit Function

  ReDim ACE((Len(ExplicitAccess) / 4) * pcCountOfExplicitEntries)
  Call MoveMemory(ACE(0), pListOfExplicitEntries, Len(ExplicitAccess) * pcCountOfExplicitEntries)


  ReDim GetAccessControlElements.List(pcCountOfExplicitEntries - 1)


  For I = 0 To pcCountOfExplicitEntries - 1
     With GetAccessControlElements.List(I)
        .grfAccessPermissions = ACE(I * 8 + 0)
        .grfAccessMode = ACE(I * 8 + 1)
        .grfInheritance = ACE(I * 8 + 2)
        .TRUSTEE.pMultipleTrustee = ACE(I * 8 + 3)
        .TRUSTEE.MultipleTrusteeOperation = ACE(I * 8 + 4)
        .TRUSTEE.TrusteeForm = ACE(I * 8 + 5)
        .TRUSTEE.TrusteeType = ACE(I * 8 + 6)
        .TRUSTEE.ptstrName = PointerToString(ACE(I * 8 + 7))
     End With
  Next


  Erase ACE
  If pSD <> 0 Then dwRes = LocalFree(pSD)
  If pDACL <> 0 Then dwRes = LocalFree(pDACL)
  If pListOfExplicitEntries <> 0 Then dwRes = LocalFree(pListOfExplicitEntries)


End Function


Function PointerToString(ByVal Pointer) As String


  Dim StringValue            As String
  Dim NullPos                As Long
  Dim Temp                   As Long


  ' *** Copy string to array and convert to a string
  If Pointer > 0 And StrLen(Pointer) > 0 Then
     StringValue = Space$(StrLen(Pointer) + 50)
     Temp = PtrToStrA(StringValue, Pointer)
     NullPos = InStr(StringValue, Chr$(0))
     If NullPos > 0 Then
        PointerToString = Left$(StringValue, NullPos - 1) 'Lose the null terminator...
     Else
        PointerToString = StringValue 'Just pass the string...
     End If
  Else
     PointerToString = ""
  End If


End Function


Sub SetError(ByVal dwErrCode As Long)


  Static sMsgBuf As String * 257, dwLen As Long


  dwLen = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM _
     Or FORMAT_MESSAGE_IGNORE_INSERTS _
      Or FORMAT_MESSAGE_MAX_WIDTH_MASK, ByVal 0&, _
     dwErrCode, LANG_USER_DEFAULT, _
     ByVal sMsgBuf, 256&, 0&)

  LastError = dwErrCode
  If dwLen Then LastErrorMsg = Left$(sMsgBuf, dwLen)


End Sub


Sub Main()
AddAccessControlElement "MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI", SE_REGISTRY_KEY, "CURRENT_USER", COMMON_FULL_CONTROL, SET_ACCESS
End Sub

Изображение

Александр80
Bonach&#243;n
Bonach&#243;n
 
Сообщения: 659
Зарегистрирован: 20.03.2004 (Сб) 23:50
Откуда: г.Москва

Сообщение Александр80 » 19.01.2005 (Ср) 18:19

:shock: Вау... :roll: :wink:

Спасибо... :lol:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.03.2007 (Ср) 19:31

1. Это до сих пор не кирпич?
2. RegConnectRegistry нету, а хочется до кучи.
Изображение

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Re: Registry

Сообщение Pantalone » 03.05.2009 (Вс) 16:02

Сабжевая функция не возвращает пустое значение ключа почему-то. Т.е. если в ключе записано значение как пустая строка, то спотыкается.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Registry

Сообщение iGrok » 03.05.2009 (Вс) 22:16

Сабжевая, это какая? Value?
Показывай, как вызываешь. У меня всё работает.
label:
cli
jmp label

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Re: Registry

Сообщение Pantalone » 04.05.2009 (Пн) 11:11

Код: Выделить всё
modRegistry.Value(RegRoots.HKEY_LOCAL_MACHINE, "Software\Test", "Test", REG_SZ) = ""
MsgBox modRegistry.Value(RegRoots.HKEY_LOCAL_MACHINE, "Software\Test", "Test", REG_SZ)


Получишь то о чем я говорю. Если я конечно правильно этим пользуюсь.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Registry

Сообщение iGrok » 04.05.2009 (Пн) 21:33

Угу. Увидел. Или я чего-то не понимаю, или там косяк с записью пустого значения. Т.е. при записи руками в реестр пустого значения там оказывается vbNullChar, а при записи кодом модуля - vbNullString...

Можно либо отлавливать ошибки при обращении к ключу (в частности, при отсутствии ключа модуль генерит ошибку, так что отлавливать всё равно надо).
Либо внести одно маленькое исправление (оно между тегами "<Добавлено>").

В процедуре:
Код: Выделить всё
Property Let Value(ByVal Root As RegRoots, RegPath As String, ValueName As String, ByRef ValueType As RegDataTypes, ByVal V As Variant)
...
  Case REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ
    If VarType(V) And vbArray Then
      strBuf = Join(V, vbNullChar) & vbNullChar & vbNullChar
      ret = RegSetValueEx(keyHandle, ValueName, 0, ValueType, ByVal strBuf, Len(strBuf))
    Else
      '<Добавлено>
      If Len(V) = 0 Then V = vbNullChar
      '</Добавлено>
      ret = RegSetValueEx(keyHandle, ValueName, 0, ValueType, ByVal CStr(V), Len(CStr(V)))
    End If
...
End Property


А лучше сделать и то и то.
label:
cli
jmp label

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Re: Registry

Сообщение Pantalone » 30.06.2016 (Чт) 20:59

Еще косяк нашел. Хотя функция старая, может так раньше было в винде.

В реестре есть строка: %CommonProgramFiles(x86)%\Microsoft Shared\DAO\dao360.dll

Она находится тут HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00000100-0000-0010-8000-00AA006D2EA4}\InprocServer32

Модуль возвращает его как
Код: Выделить всё
25,43,6F,6D,6D,6F,6E,50,72,6F,67,72,61,6D,46,69,6C,65,73,28,78,38,36,29,25,5C,4D,69,63,72,6F,73,6F,66,74,20,53,68,61,72,65,64,5C,44,41,4F,5C,64,61,6F,33,36,30,2E,64,6C,6C,00


А экспорт regedit выдает:
Код: Выделить всё
25,00,43,00,6f,00,6d,00,6d,00,6f,00,6e,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,28,00,78,00,38,00,36,00,29,00,25,00,5c,00,4d,00,69,00,63,00,72,00,6f,00,73,00,6f,00,66,00,74,00,20,00,53,00,68,00,61,00,72,00,65,00,64,00,5c,00,44,00,41,00,4f,00,5c,00,64,00,61,00,6f,00,33,00,36,00,30,00,2e,00,64,00,6c,00,6c,00,00,00


Нули добавить не проблема, но просто интересно, почему так сделано в модуле.

След.

Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList  
cron