| |
VB & Windows APIBesitz von Dateien übernehmen | | | Autor: NHZ | Datum: 17.05.04 17:17 |
| Hallo,
ich möchte den Besitz von Dateien/Verzeichnissen übernehmen, auch wenn die Administratoren keinen expliziten Zugriff darauf haben. Dazu gibt es unter
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/security/taking_object_ownership_in_c__.asp
einen Beispiel-Code für C++.
Ich habe versucht diesen Code nach VB zu übersetzen. Leider bekomme ich in der Zeile 'dwRes = SetEntriesInAcl(NUM_ACES, ea, pOldDACL, pNewDACL)' den Fehler
Typen unverträglich.
Wer kann mir sagen warum?
Danke im vorraus
Hier der Code der Funktion
Private Function SetOwnership() As Boolean
Dim ea(NUM_ACES - 1) As EXPLICIT_ACCESS
Dim SIDAuthWorld As SID_IDENTIFIER_AUTHORITY
Dim SIDAuthNT As SID_IDENTIFIER_AUTHORITY
Dim pSIDAdmin As Long
Dim pSIDEveryone As Long
Dim pACL As Long
Dim pNewDACL As Long
Dim pOldDACL As Long
Dim dwRes As Long
SIDAuthWorld.Value(6) = SECURITY_WORLD_SID_AUTHORITY
SIDAuthNT.Value(6) = SECURITY_NT_AUTHORITY
' Specify the DACL to use.
' Create a SID for the Everyone group.
dwRes& = AllocateAndInitializeSid(SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, _
0, 0, 0, 0, 0, 0, pSIDEveryone)
If dwRes& = 0 Then
MsgBox "AllocateAndInitializeSid (Everyone) error (" & dwRes& & "):" & _
dwRes&
GoTo Cleanup
End If
' Create a SID for the BUILTIN\Administrators group.
dwRes& = AllocateAndInitializeSid(SIDAuthNT, 2, _
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, _
0, 0, 0, 0, 0, 0, pSIDAdmin)
If dwRes& = 0 Then
MsgBox "AllocateAndInitializeSid (Admin) error (" & dwRes& & "):" & _
dwRes&
GoTo Cleanup
End If
' Set read access for Everyone.
ea(0).grfAccessPermissions = GENERIC_READ
ea(0).grfAccessMode = SET_ACCESS
ea(0).grfInheritance = NO_INHERITANCE
ea(0).pTRUSTEE.TrusteeForm = TRUSTEE_IS_SID
ea(0).pTRUSTEE.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP
ea(0).pTRUSTEE.ptstrName = pSIDEveryone
' Set full control for Administrators.
ea(1).grfAccessPermissions = GENERIC_ALL
ea(1).grfAccessMode = SET_ACCESS
ea(1).grfInheritance = NO_INHERITANCE
ea(1).pTRUSTEE.TrusteeForm = TRUSTEE_IS_SID
ea(1).pTRUSTEE.TrusteeType = TRUSTEE_IS_GROUP
ea(1).pTRUSTEE.ptstrName = pSIDAdmin
' SetEntriesInAcl() API
dwRes = SetEntriesInAcl(NUM_ACES, ea, pOldDACL, pNewDACL)
If dwRes& <> ERROR_SUCCESS Then
MsgBox "Failed SetEntriesInAcl error (" & dwRes& & "):" & dwRes&
GoTo Cleanup
End If
.....
....
End Function | |
Re: Besitz von Dateien übernehmen | | | Autor: Obi | Datum: 17.05.04 21:27 |
| Hallo,
1. ist der Code nicht dazu da um den Besitz zu übernehmen, sondern um die Rechte auf eine Datei zu setzen. Das ist ein wichtiger Unterschied.
2. Poste mal die ganzen API Deklarationen dazu.
Gruß
Obi | |
Re: Besitz von Dateien übernehmen | | | Autor: NHZ | Datum: 19.05.04 09:47 |
| Hallo
Der Code des Original-Beispiels versucht zunächst die Berechtigungen zu ändern. Wenn das fehlschlägt, versucht er den sich das Recht SE_TAKE_OWNERSHIP_NAME für den Prozess zu holen, um dann den Besitz zu übernehmen.
Gruß NHZ
Hier die Declarationen:
Private Const ERROR_SUCCESS = &H0
Private Const ERROR_ACCESS_DENIED = &H5
Private Const SE_FILE_OBJECT = 1&
Private Const DACL_SECURITY_INFORMATION = &H4
Private Const SET_ACCESS = &H2
Private Const SYNCHRONIZE = &H100000
Private Const READ_CONTROL = &H20000
Private Const WRITE_DAC = &H40000
Private Const WRITE_OWNER = &H80000
Private Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Private Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Private Const DELETE = &H10000
Private Const GENERIC_ALL = &H10000000
Private Const GENERIC_EXECUTE = &H20000000
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const CONTAINER_INHERIT_ACE = &H2
Private Const OBJECT_INHERIT_ACE = &H1
Const SECURITY_NULL_SID_AUTHORITY = 0
Const SECURITY_WORLD_SID_AUTHORITY = 1
Const SECURITY_LOCAL_SID_AUTHORITY = 2
Const SECURITY_CREATOR_SID_AUTHORITY = 3
Const SECURITY_NON_UNIQUE_AUTHORITY = 4
Const SECURITY_NT_AUTHORITY = 5
Const SECURITY_BUILTIN_DOMAIN_RID = &H20
Const SECURITY_WORLD_RID = &H0
Const DOMAIN_ALIAS_RID_ADMINS = &H220
Const DOMAIN_ALIAS_RID_USERS = &H221
Const DOMAIN_ALIAS_RID_GUESTS = &H222
Const DOMAIN_ALIAS_RID_POWER_USERS = &H223
Const OWNER_SECURITY_INFORMATION = &H1
Const GROUP_SECURITY_INFORMATION = &H2
Const NO_INHERITANCE = &H0
Private Type SID_IDENTIFIER_AUTHORITY
Value(6) As Byte
End Type
Private Type TRUSTEE
pMultipleTrustee As Long
MultipleTrusteeOperation As Long
TrusteeForm As Long
TrusteeType As Long
ptstrName As String
End Type
Private Enum TRUSTEE_FORM
TRUSTEE_IS_SID
TRUSTEE_IS_NAME
TRUSTEE_BAD_FORM
TRUSTEE_IS_OBJECTS_AND_SID
TRUSTEE_IS_OBJECTS_AND_NAME
End Enum
Private Enum TRUSTEE_TYPE
TRUSTEE_IS_UNKNOWN
TRUSTEE_IS_USER
TRUSTEE_IS_GROUP
TRUSTEE_IS_DOMAIN
TRUSTEE_IS_ALIAS
TRUSTEE_IS_WELL_KNOWN_GROUP
TRUSTEE_IS_DELETED
TRUSTEE_IS_INVALID
TRUSTEE_IS_COMPUTER
End Enum
Private Type EXPLICIT_ACCESS
grfAccessPermissions As Long
grfAccessMode As Long
grfInheritance As Long
pTRUSTEE As TRUSTEE
End Type
Private Declare Function AllocateAndInitializeSid Lib "Advapi32.dll" ( _
pIdentifierAuthority As SID_IDENTIFIER_AUTHORITY, _
ByVal nSubAuthorityCount As Long, ByVal dwSubAuthority0 As Long, ByVal _
dwSubAuthority1 As Long, _
ByVal dwSubAuthority2 As Long, ByVal dwSubAuthority3 As Long, ByVal _
dwSubAuthority4 As Long, _
ByVal dwSubAuthority5 As Long, ByVal dwSubAuthority6 As Long, ByVal _
dwSubAuthority7 As Long, pSid As Long) As Long
Private Declare Sub BuildExplicitAccessWithName Lib "Advapi32.dll" Alias _
"BuildExplicitAccessWithNameA" _
(ea As Any, _
ByVal TrusteeName As String, _
ByVal AccessPermissions As Long, _
ByVal AccessMode As Integer, _
ByVal Inheritance As Long)
Private Declare Function SetEntriesInAcl Lib "Advapi32.dll" Alias _
"SetEntriesInAclA" _
(ByVal CountofExplicitEntries As Long, _
ea As Any, _
ByVal OldAcl As Long, _
NewAcl As Long) As Long
Private Declare Function GetNamedSecurityInfo Lib "Advapi32.dll" Alias _
"GetNamedSecurityInfoA" _
(ByVal ObjName As String, _
ByVal SE_OBJECT_TYPE As Long, _
ByVal SecInfo As Long, _
ByVal pSid As Long, _
ByVal pSidGroup As Long, _
pDacl As Long, _
ByVal pSacl As Long, _
pSecurityDescriptor As Long) As Long
Private Declare Function SetNamedSecurityInfo Lib "Advapi32.dll" Alias _
"SetNamedSecurityInfoA" _
(ByVal ObjName As String, _
ByVal SE_OBJECT As Long, _
ByVal SecInfo As Long, _
ByVal pSid As Long, _
ByVal pSidGroup As Long, _
ByVal pDacl As Long, _
ByVal pSacl As Long) As Long
Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function FreeSid Lib "Advapi32" (ByVal hMem As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As _
Long | |
Re: Besitz von Dateien übernehmen | | | Autor: Obi | Datum: 19.05.04 18:21 |
| Hallo,
versuche es mal so.
' SetEntriesInAcl() API
dwRes = SetEntriesInAcl(NUM_ACES, ea(0), pOldDACL, pNewDACL)
If dwRes& <> ERROR_SUCCESS Then
MsgBox "Failed SetEntriesInAcl error (" & dwRes& & "):" & dwRes&
GoTo Cleanup
End If Gruß
Obi | |
Re: Besitz von Dateien übernehmen | | | Autor: NHZ | Datum: 21.05.04 12:40 |
| Hallo,
leider bekomme ich jetzt den Fehler 87 (Falscher Parameter)
Da ja eine neue ACL erstellt wird habe ich auch fogende Variante probiert.
dwRes = SetEntriesInAcl(NUM_ACES, ea(0), 0&, pNewDACL) Gruß
NHZ | |
Re: Besitz von Dateien übernehmen | | | Autor: Obi | Datum: 21.05.04 17:50 |
| Hi,
also ich habe nochmal in einem meiner Projekte nachgesehen und das geht bei mir sehr gut. Was ich bei dir nicht gefunden habe ist die Deklaration von (NUM_ACES, ist das vielleicht nicht oder falsch deklariert?
Gruß
Obi | |
Re: Besitz von Dateien übernehmen | | | Autor: Obi | Datum: 22.05.04 23:56 |
| Hallo,
mir ist da noch ein fehlerhafter Trustee-Type aufgefallen.
Public Type TRUSTEE
pMultipleTrustee As Long
MultipleTrusteeOperation As long
TrusteeForm As long
TrusteeType As long
ptstrName As Long 'String
End Type Du hattest da noch String stehen, da die C API aber mit Pointern arbeitet, musst du den Strin in ein Long umwandeln.
Gruß | |
Re: Besitz von Dateien übernehmen | | | Autor: NHZ | Datum: 24.05.04 17:00 |
| Hallo,
es funktioniert.
Übrigens die Zeilen:
SIDAuthWorld.Value(6) = SECURITY_WORLD_SID_AUTHORITY
SIDAuthNT.Value(6) = SECURITY_NT_AUTHORITY
müssen
SIDAuthWorld.Value(5) = SECURITY_WORLD_SID_AUTHORITY
SIDAuthNT.Value(5) = SECURITY_NT_AUTHORITY
heisen. Andernfalls erhält man den Fehler 1307: Diese Sicherheitsstruktur kann nicht als Besitzer hizugefügt werden.
vielen Dank für Deine Hilfe!!!
NHZ | |
Re: Besitz von Dateien übernehmen | | | Autor: azn_ki | Datum: 27.06.05 15:26 |
| Hallo
wer ist so nett... und gibt mir den ganzen code... hehe
ich habe lange nach dem gesucht
Also ich wäre echt froh darum, da ichs schon versucht habe und es hat nur fehler gegeben und ich habe keine zeit.. zum lange herumzuprobieren | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere Infos
|