Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
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.
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.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
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
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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Ok. Also eine zweite exe ausführen, die von sich aus Adminrechte (Compileroption) anfordert.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
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
(In der Hilfe ist das nirgends zu finden.)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Schau mal, wie man sowas verwenden kann:
http://www.purebasic.fr/english/viewtopic.php?p=220852
http://www.purebasic.fr/german/viewtopic.php?p=239695
Vielleicht hilft es dir ja.
http://www.purebasic.fr/english/viewtopic.php?p=220852
http://www.purebasic.fr/german/viewtopic.php?p=239695
Vielleicht hilft es dir ja.
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Ich wollt doch nur .... 
Ok ... erstmal ne menge zu lesen. Danke !

Ok ... erstmal ne menge zu lesen. Danke !
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
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
Gruß
Thomas
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
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
Ah eine Kürzung
Ich verfusselte mich schon in dem orginalen endlosen Code...
Herzlichen Dank.

Herzlichen Dank.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
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...
anders gehen. Bspw. Tools wie der ProcessExplorer bieteten auch
die Möglichkeit nachträglich als Admin zu laufen...
"Papa, ich laufe schneller - dann ist es nicht so weit."
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
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.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...
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

PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?
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?

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?
"Papa, ich laufe schneller - dann ist es nicht so weit."