Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?

Beitrag 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.
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​​
Benutzeravatar
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 ?

Beitrag 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
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.
Bild
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?

Beitrag 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.)
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​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?

Beitrag von RSBasic »

Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?

Beitrag von Bisonte »

Ich wollt doch nur .... ;)

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​​
Benutzeravatar
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 ?

Beitrag 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 :mrgreen:

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
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.
Bild
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?

Beitrag von Bisonte »

Ah eine Kürzung :allright: Ich verfusselte mich schon in dem orginalen endlosen Code...

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​​
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?

Beitrag 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...
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?

Beitrag 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 ;) )
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​​
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Windows Vista/7 - Nachträglich Admin.-Rechte anfordern ?

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