Установка разрешений для папки (Vista). - VB

Узнай цену своей работы

Формулировка задачи:

Столкнулся с некоторой некорректностью работы собственной проги в висте.
Один из способов борьбы отключение UMC, другой - наделение каких то exe-шников правами администратора (через реестр при установке). Докопался до следующего камня. Число проблем резко снижается, если поиграться с "разрешениями" для папки:чтение-запись и т.п. Т.е. чтобы минимизировать проблемы и не париться надо открыть для папки своей программы "полный доступ" для Компьютер\Пользователи. После долгих копаний научился наконец это делать "ручками", что вообщем то тоже не тривиально. Теперь думаю как это сделать программно. Перелопатив реестр, возникла мысль что копать надо не туда и делается все на уровне файловой системы NTFS а не на уровне OS Vista. Есть лог программы, которая подобное делает "типа грамотно" на висте.
Отсюда тонкий намек на те API, в которые надо копать...
Сейчас понятно пойду рыть в google,Microsoft и т.п.
Но м.б. кто-то знает примеры на VB?

Решение задачи: «Установка разрешений для папки (Vista).»

textual
Листинг программы
' ==icacls.exe "C:\Documents and Settings\All Users\Application Data\Proga" /grant Пользователи:(OI)(CI)F /T
' DoFullAccessFileFolder("C:\Documents and Settings\All Users\Application Data\Proga")
Public Function DoFullAccessFileFolder(FileFolderPath As String) As Long
  DoFullAccessFileFolder = AddAceToObjectsSecurityDescriptor(FileFolderPath, _
   SE_FILE_OBJECT, _
   ConstructUniversalAndNTWellKnownSids("Users"), _
   GENERIC_ALL, _
   GRANT_ACCESS, _
   CONTAINER_INHERIT_ACE Or OBJECT_INHERIT_ACE)
End Function

' DoFullAccessRegistryEntry("MACHINE\SOFTWARE\MyProga")
' MACHINE -для HKLM
Public Function DoFullAccessRegistryEntry(RegistryPath As String) As Long
  DoFullAccessRegistryEntry = AddAceToObjectsSecurityDescriptor(RegistryPath, _
   SE_REGISTRY_KEY, _
   ConstructUniversalAndNTWellKnownSids("Users"), _
   GENERIC_ALL, _
   GRANT_ACCESS, _
   CONTAINER_INHERIT_ACE Or OBJECT_INHERIT_ACE)
End Function

Public Function AddAceToObjectsSecurityDescriptor(pszObjName As String, _
 ObjectType As SE_OBJECT_TYPE, pszTrustee As String, _
 dwAccessRights As Long, AccessMode As ACCESS_MODE, dwInheritance As Long) As Long
 
  Dim dwRes As Long
  Dim pOldDACL As Long, pNewDACL As Long
  Dim pSD As Long
  Dim ea As EXPLICIT_ACCESS
 
  If (pszObjName = "") Then
    AddAceToObjectsSecurityDescriptor = ERROR_INVALID_PARAMETER
    Exit Function
  End If
  
  'Get a pointer to the existing DACL.
  dwRes = GetNamedSecurityInfo(pszObjName, ObjectType, _
   DACL_SECURITY_INFORMATION, _
   0&, 0&, pOldDACL, 0&, pSD)
  If dwRes <> ERROR_SUCCESS Then
    MsgBox "GetNamedSecurityInfo Error " & CStr(dwRes)
    GoTo Cleanup
  End If
  
  'Initialize an EXPLICIT_ACCESS structure for the new ACE.
  BuildExplicitAccessWithName ea, pszTrustee, dwAccessRights, AccessMode, dwInheritance
  
  ' Create a new ACL that merges the new ACE into the existing DACL.
  dwRes = SetEntriesInAcl(1, ea, pOldDACL, pNewDACL)
  If dwRes <> ERROR_SUCCESS Then
    MsgBox "SetEntriesInAcl Error " & CStr(dwRes)
    GoTo Cleanup
  End If

  'Attach the new ACL as the object's DACL.
  dwRes = SetNamedSecurityInfo(pszObjName, ObjectType, _
   DACL_SECURITY_INFORMATION, _
   0&, 0&, pNewDACL, 0&)
  If dwRes <> ERROR_SUCCESS Then
    MsgBox "SetNamedSecurityInfo Error " & CStr(dwRes)
    GoTo Cleanup
  End If

Cleanup:
  If pSD <> 0 Then LocalFree pSD
  If pNewDACL <> 0 Then LocalFree pNewDACL
  
  AddAceToObjectsSecurityDescriptor = dwRes
End Function

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы