Seite 1 von 2
Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Verfasst: 12.11.2010 17:55
von Bisonte
Hallo...
Ich bin gerade dabei mich an einer "Verzeichnis - Kopierroutine" zu versuchen.
Dabei stellt sich mir auf Windows 7 der Administrator einen Fuß dazwischen.
Wenn ich z.B. etwas nach C:\ kopieren möchte, scheitert es an den fehlenden Rechten.
Mit IsUserAnAdmin_() kann ich schonmal prüfen ob der Adminmodus läuft.
Ist es möglich, nachträglich die Adminrechte einzufordern und wenn ja, wie ?
Und es interessiert mich, wie man prüfen kann, ob ein Pfad nur ein "virtueller Ordner" ist, sowie
ob überhaupt Adminrechte für einen Pfad benötigt werden, in den ich kopieren möchte.
Grund warum ich nicht von Anfang an den Adminmodus anfrage ?
Ich persönlich finde es immer "aufmerksamkeitserregend", wenn ein mir relativ unbekanntes Programm
den Adminmodus haben will...
Ich fänd es besser bei einer Funktion, wo ich weiss das die Rechte gebraucht werden, sie nur dann zu holen.
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Verfasst: 12.11.2010 18:11
von ts-soft
Selber hallo ...
Virtuelles Verzeichnis erkennst Du am Attribut: #FILE_ATTRIBUTE_REPARSE_POINT
Wenn das erstellen Fehlschlägt und es ist ein beschreibbares Laufwerk, dann benötigst Du Adminrechte.
Zweites Tool mit Adminrechten kompilieren, dieses dann mit parametern starten und die weiteren Verzeichnisse
anlegen lassen.
Gruß
Thomas
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Verfasst: 12.11.2010 18:29
von Bisonte
ts-soft hat geschrieben:Selber hallo ...
Virtuelles Verzeichnis erkennst Du am Attribut: #FILE_ATTRIBUTE_REPARSE_POINT
Wenn das erstellen Fehlschlägt und es ist ein beschreibbares Laufwerk, dann benötigst Du Adminrechte.
Zweites Tool mit Adminrechten kompilieren, dieses dann mit parametern starten und die weiteren Verzeichnisse
anlegen lassen.
Gruß
Thomas
Ok. Also eine zweite exe ausführen, die von sich aus Adminrechte (Compileroption) anfordert.
Gut, soweit hab ich das begriffen (ich entnehme deiner Aussage : ein nachträgliches anfordern geht nicht)
Und jetzt die Frage : Wie bekomme ich das
#FILE_ATTRIBUTE_REPARSE_POINT
Ist das per
Code: Alles auswählen
FileAttribute = DirectoryEntryAttributes(#Verzeichnis)
If FileAttribute & #FILE_ATTRIBUTE_REPARSE_POINT
Debug "Virtuell !"
EndIf
zu bekommen ?
(In der Hilfe ist das nirgends zu finden.)
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Verfasst: 12.11.2010 18:35
von RSBasic
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Verfasst: 12.11.2010 18:49
von Bisonte
Ich wollt doch nur ....
Ok ... erstmal ne menge zu lesen. Danke !
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Verfasst: 12.11.2010 19:18
von ts-soft
Die FileSystem-Funktionen von PB unterstützen auch diese API-Konstanten! Haste also richtig erkannt.
GetFileAttributes_(@Directory$) & #FILE_ATTRIBUTE_REPARSE_POINT
Obiger Code etwas aufgeräumter von freak, finde den Thread leider nicht, suchfunktion ist ja sinnlos geworden
Code: Alles auswählen
; WinIoCtl.h
#FILE_DEVICE_FILE_SYSTEM = $00000009
#METHOD_BUFFERED = 0
#FILE_ANY_ACCESS = 0
#FILE_SPECIAL_ACCESS = (#FILE_ANY_ACCESS)
Macro CTL_CODE( DeviceType, Function, Method, Access )
(((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
EndMacro
#FSCTL_SET_REPARSE_POINT = CTL_CODE(#FILE_DEVICE_FILE_SYSTEM, 41, #METHOD_BUFFERED, #FILE_SPECIAL_ACCESS)
#FSCTL_GET_REPARSE_POINT = CTL_CODE(#FILE_DEVICE_FILE_SYSTEM, 42, #METHOD_BUFFERED, #FILE_ANY_ACCESS)
#FSCTL_DELETE_REPARSE_POINT = CTL_CODE(#FILE_DEVICE_FILE_SYSTEM, 43, #METHOD_BUFFERED, #FILE_SPECIAL_ACCESS)
; Winbase.h
;
#FILE_FLAG_OPEN_REPARSE_POINT = $00200000
; WinNT.h
;
#IO_REPARSE_TAG_MOUNT_POINT = $A0000003
#IO_REPARSE_TAG_HSM = $C0000004
#IO_REPARSE_TAG_HSM2 = $80000006
#IO_REPARSE_TAG_SIS = $80000007
#IO_REPARSE_TAG_DFS = $8000000A
#IO_REPARSE_TAG_SYMLINK = $A000000C
#IO_REPARSE_TAG_DFSR = $80000012
; From Windows Driver Kit.
; http://msdn.microsoft.com/en-us/library/ms791514.aspx
;
Structure SymbolicLinkReparseBuffer
SubstituteNameOffset.w
SubstituteNameLength.w
PrintNameOffset.w
PrintNameLength.w
Flags.l
PathBuffer.w[1]
EndStructure
Structure MountPointReparseBuffer
SubstituteNameOffset.w
SubstituteNameLength.w
PrintNameOffset.w
PrintNameLength.w
PathBuffer.w[1]
EndStructure
Structure GenericReparseBuffer
DataBuffer.b[1]
EndStructure
Structure REPARSE_DATA_BUFFER
ReparseTag.l
ReparseDataLength.w
Reserved.w
StructureUnion
SymbolicLinkReparseBuffer.SymbolicLinkReparseBuffer
MountPointReparseBuffer.MountPointReparseBuffer
GenericReparseBuffer.GenericReparseBuffer
EndStructureUnion
EndStructure
; Tries to follow a directory link on Windows Vista (should also work for files)
;
; - If the directory is no link, the result is the original directory
; - If the target cannot be read, the result is ""
;
Procedure.s GetDirectoryTarget(Directory$)
Protected TokenHandle, BufferSize, hDirectory, BytesReturned.l
Protected Privileges.TOKEN_PRIVILEGES
Protected *Buffer.REPARSE_DATA_BUFFER
Protected Result$ = ""
; Check if the directory is a reparse point (link or mount point)
;
If GetFileAttributes_(@Directory$) & #FILE_ATTRIBUTE_REPARSE_POINT
; The backup privilege is required to open a directory for io queries
; So try to set it on our process token. (usually it should be set already)
;
If OpenProcessToken_(GetCurrentProcess_(), #TOKEN_ADJUST_PRIVILEGES, @TokenHandle)
Privileges\PrivilegeCount = 1
Privileges\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED
If LookupPrivilegeValue_(#Null, @"SeBackupPrivilege", @Privileges\Privileges[0]\Luid)
AdjustTokenPrivileges_(TokenHandle, #False, @Privileges, SizeOf(TOKEN_PRIVILEGES), #Null, #Null)
EndIf
CloseHandle_(TokenHandle)
EndIf
; Open the directory
; Have to pass 0 as access right (not #GENERIC_READ), as it fails otherwise
; http://www.codeproject.com/KB/vista/Windows_Vista.aspx
;
hDirectory = CreateFile_(@Directory$, 0, #FILE_SHARE_READ|#FILE_SHARE_WRITE, #Null, #OPEN_EXISTING, #FILE_FLAG_OPEN_REPARSE_POINT | #FILE_FLAG_BACKUP_SEMANTICS, #Null)
If hDirectory <> #INVALID_HANDLE_VALUE
; Allocate a buffer for the io query. 1000 bytes should be enough for the real path (in unicode)
;
BufferSize = SizeOf(REPARSE_DATA_BUFFER) + 1000
*Buffer = AllocateMemory(BufferSize)
If *Buffer
; Query the directory for reparse point information
;
If DeviceIoControl_(hDirectory, #FSCTL_GET_REPARSE_POINT, #Null, 0, *Buffer, BufferSize, @BytesReturned, #Null) <> 0
; Check the kind of reparse point (device drivers can create their own tags, so this is important)
; The "& $FFFFFFFF" is for 64bit, as the tags are negative when interpreted as quads
;
If *Buffer\ReparseTag & $FFFFFFFF = #IO_REPARSE_TAG_MOUNT_POINT
; Read the result. The offset and length are in bytes. PeekS needs length in characters
;
Result$ = PeekS(@*Buffer\MountPointReparseBuffer\PathBuffer[0] + *Buffer\MountPointReparseBuffer\SubstituteNameOffset, *Buffer\MountPointReparseBuffer\SubstituteNameLength / 2, #PB_Unicode)
ElseIf *Buffer\ReparseTag & $FFFFFFFF = #IO_REPARSE_TAG_SYMLINK
Result$ = PeekS(@*Buffer\SymbolicLinkReparseBuffer\PathBuffer[0] + *Buffer\SymbolicLinkReparseBuffer\SubstituteNameOffset, *Buffer\SymbolicLinkReparseBuffer\SubstituteNameLength / 2, #PB_Unicode)
EndIf
EndIf
FreeMemory(*Buffer)
EndIf
CloseHandle_(hDirectory)
EndIf
Else
; It is not a reparse point, so return the original path
;
Result$ = Directory$
EndIf
; Since the result is a unicode directory name, it can have the "\??\" prefix which allows a length of 32767 characters.
;
If Left(Result$, 4) = "\??\"
Result$ = Right(Result$, Len(Result$)-4)
EndIf
ProcedureReturn Result$
EndProcedure
Gruß
Thomas
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Verfasst: 12.11.2010 20:13
von Bisonte
Ah eine Kürzung

Ich verfusselte mich schon in dem orginalen endlosen Code...
Herzlichen Dank.
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Verfasst: 15.11.2010 11:02
von dige
Das mit den Admin-Rechten anfordern muss doch auch irgendwie
anders gehen. Bspw. Tools wie der ProcessExplorer bieteten auch
die Möglichkeit nachträglich als Admin zu laufen...
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Verfasst: 15.11.2010 13:46
von Bisonte
dige hat geschrieben:Das mit den Admin-Rechten anfordern muss doch auch irgendwie
anders gehen. Bspw. Tools wie der ProcessExplorer bieteten auch
die Möglichkeit nachträglich als Admin zu laufen...
Vielleicht nutzen diese Tools das "Exe in den Ram transferieren und dort starten" Prinzip. So wie mir ts-soft ganz am Anfang schrieb.... Die entsprechende Funktion ist mit sicherheit extrem klein (Grösse) , und fällt somit überhaupt nicht auf.
Ich löse es nun so, dass die "Copy" Routine als eigenständige exe aufgerufen wird, die Adminrechte fordert.
Wenn das Projekt sich dem Beta" Status nähert, dann werd ich die in die Main.exe einbauen und dann im RAM starten...
(Hab irgendwo im Forum gelesen wie das gehen soll

)
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Verfasst: 15.11.2010 16:05
von dige
Das ist aber imho ein ziemlich Hacker mässiges vorgehen

Könnte mir gut vorstellen das Exe's im RAM starten schnell
mal von einer Firewall oder einem Virenscanner als Angriff
gewertet wird...
Also um das nochmal zu konkretisieren: Admin Rechte kann
man sich ab Vista/Win7 nur noch beim Programmstart und
nicht mehr via Security Tokens holen?