WinVista Sicherheits-Konzept / REPARSE_POINTS
-
Hat jemand Kentnisse bezüglich des WinVista Sicherheits-Konzeptes ?
Ich lese mit
hFile = CreateFile(MyFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);und
bool bRet = DeviceIoControl(hFile, FSCTL_GET_REPARSE_POINT, NULL, 0, rdata, dwBufSize, &dwRetLen, NULL);den PrintName (Zielverzeichnis) eines REPARSE_POINTS aus.
Was ich nicht verstehe ist, dass die Anwendung das 'SE_BACKUP_NAME' Privileg braucht und dann trotzdem Admin-Rechte verlangt.
Wenn das Privileg nicht gesetzt ist und das Programm als Admin läuft, funktioniert´s auch nicht...Admin-Rechte und trotzdem Privileg ? MSDN hat auch keinen Hinweis dazu.
(ReparsePoints bei NTFS unterliegen laut Linux-Quellen dem Betriebsgeheimnis von M$)
==>Eisbeer<==
-
Woraus schließt Du, dass Adim in Rechte benötigt werden?
Das Privileg SeBackupPrivilege sollte genügen.
-
Wenn das Prog ohne Admin-Rechte läuft gibt´s keine Ausgabe.
Mit Admin-Rechten funktionierts.Hatte ich doch schon erwähnt oder ?
Ich vermute nicht, sondern hab es ausprobiert.
==>Eisbeer<==
-
Hier die SchreenShots und der QuellCode...
http://www.eisbeer.de/screenshot_0011.jpg
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include <winIOCtl.h> //DeviceIoControl //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { typedef struct _REPARSE_DATA_BUFFER { ULONG ReparseTag; USHORT ReparseDataLength; USHORT Reserved; union { struct { USHORT SubstituteNameOffset; USHORT SubstituteNameLength; USHORT PrintNameOffset; USHORT PrintNameLength; WCHAR PathBuffer[1]; } SymbolicLinkReparseBuffer; struct { USHORT SubstituteNameOffset; USHORT SubstituteNameLength; USHORT PrintNameOffset; USHORT PrintNameLength; WCHAR PathBuffer[1]; } MountPointReparseBuffer; struct { UCHAR DataBuffer[1]; } GenericReparseBuffer; }; } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; //--WinNT.h VisualStudio 2008 #define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L) #define IO_REPARSE_TAG_HSM (0xC0000004L) #define IO_REPARSE_TAG_SIS (0x80000007L) #define IO_REPARSE_TAG_DFS (0x8000000AL) #define IO_REPARSE_TAG_SYMLINK (0xA000000CL) #define IO_REPARSE_TAG_DFSR (0x80000012L) //-- PrivilegSetzen(SE_BACKUP_NAME,TRUE); HANDLE hFile; REPARSE_DATA_BUFFER* buffer; LPCTSTR MyFile = Form1->Edit1->Text.c_str(); //const char* hFile = CreateFile(MyFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL); if (hFile == INVALID_HANDLE_VALUE) { LPVOID lpMsgBuf; //Puffer anlegen AnsiString ErrorMessage = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Standard Sprache (LPTSTR) &lpMsgBuf, 0, NULL ); if(ErrorMessage !=0) { AnsiString text = "--"; AppendStr(text,"Felher CreateFile--"); AppendStr(text,ErrorMessage.c_str()); Form1->Memo1->Lines->Add(text); } } //CloseHandle(hFile); DWORD dwBufSize = MAXIMUM_REPARSE_DATA_BUFFER_SIZE; REPARSE_DATA_BUFFER* rdata; rdata = (REPARSE_DATA_BUFFER*) malloc(dwBufSize); DWORD dwRetLen; bool bRet = DeviceIoControl(hFile, FSCTL_GET_REPARSE_POINT, NULL, 0, rdata, dwBufSize, &dwRetLen, NULL); if (bRet == false) { LPVOID lpMsgBuf; //Puffer anlegen AnsiString ErrorMessage = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Standard Sprache (LPTSTR) &lpMsgBuf, 0, NULL ); if(ErrorMessage !=0) { AnsiString text = "--"; AppendStr(text,"Felher DeviceIOControl--"); AppendStr(text,ErrorMessage.c_str()); Form1->Memo1->Lines->Add(text); } } CloseHandle(hFile); switch(rdata->ReparseTag) { case IO_REPARSE_TAG_MOUNT_POINT: Form1->Label4->Caption = "MOUNT_POINT"; break; case IO_REPARSE_TAG_HSM: Form1->Label4->Caption = "HSM"; break; case IO_REPARSE_TAG_SIS: Form1->Label4->Caption = "SIS"; break; case IO_REPARSE_TAG_SYMLINK: Form1->Label4->Caption = "SYMLINK"; break; case IO_REPARSE_TAG_DFSR: Form1->Label4->Caption = "DFSR"; break; case IO_REPARSE_TAG_DFS: Form1->Label4->Caption = "DFS"; break; default: Form1->Label4->Caption = "unknown"; break; } if (IsReparseTagMicrosoft(rdata->ReparseTag)) { size_t slen = rdata->MountPointReparseBuffer.SubstituteNameLength / sizeof(WCHAR); WCHAR *szSubName = new WCHAR[slen+1]; wcsncpy(szSubName, &rdata->MountPointReparseBuffer.PathBuffer[rdata->MountPointReparseBuffer.SubstituteNameOffset / sizeof(WCHAR)], slen); szSubName[slen] = 0; Form1->Label5->Caption = szSubName; delete [] szSubName; size_t plen = rdata->MountPointReparseBuffer.PrintNameLength / sizeof(WCHAR); WCHAR *szPrintName = new WCHAR[plen+1]; wcsncpy(szPrintName, &rdata->MountPointReparseBuffer.PathBuffer[rdata->MountPointReparseBuffer.PrintNameOffset / sizeof(WCHAR)], plen); szPrintName[plen] = 0; Form1->Label6->Caption = szPrintName; delete [] szPrintName; } else { Form1->Memo1->Lines->Add("Not a Microsoft-reparse point - could not query data!"); } free(rdata); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Form1->BorderStyle = bsSingle; //Fenster kann nicht mehr skalliert werden Form1->BorderIcons >> biMaximize; //Form 1 MaximierenButton aus Form1->BorderIcons >> biMinimize; //Form 1 MinimierenButton aus Form1->Position = poScreenCenter; Form1->Caption = "Reparse_Point"; Form1->Edit1->Text = "C:\\Programme"; Form1->Button1->Caption = "Lesen"; Form1->Label1->Caption = "Reparse Tag Typ:"; Form1->Label2->Caption = "Mount Pont:"; Form1->Label3->Caption = "Print Name:"; Form1->Label4->Caption = ""; Form1->Label5->Caption = ""; Form1->Label6->Caption = ""; Form1->Memo1->Clear(); } //--------------------------------------------------------------------------- void __fastcall TForm1::PrivilegSetzen(const char* Name, bool Setzen) { AnsiString Text = "Privileg gesetzt: "; AppendStr(Text,Name); Form1->Memo1->Lines->Add(Text); Form1->Memo1->Lines->Add("\n"); HANDLE hToken; //Handle fuer prozes Token TOKEN_PRIVILEGES tkp; //Zeiger auf TokenStruktur //Aktuellen Prozess Token Handle abfragen um //Privilege zu bekommen. if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)); { LPVOID lpMsgBuf; //Puffer anlegen AnsiString ErrorMessage = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Standard Sprache (LPTSTR) &lpMsgBuf, 0, NULL ); if(ErrorMessage !="0") { MessageBoxEx(NULL,ErrorMessage.c_str(),"Open Process Token",MB_ICONQUESTION, MB_OK); } LocalFree(lpMsgBuf); //Puffer freigeben } //LUID fuer Privileg bekommen if(!LookupPrivilegeValue(NULL, Name,&tkp.Privileges[0].Luid)); { LPVOID lpMsgBuf; //Puffer anlegen AnsiString ErrorMessage = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Standard Sprache (LPTSTR) &lpMsgBuf, 0, NULL ); if(ErrorMessage !="0") { MessageBoxEx(NULL,ErrorMessage.c_str(),"LookupPrivilegeValue",MB_ICONQUESTION, MB_OK); } LocalFree(lpMsgBuf); //Puffer freigeben } tkp.PrivilegeCount = 1; //Ein Privileg zu setzen if(Setzen) { tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; } else { tkp.Privileges[0].Attributes = 0; } //Privileg fuer aktuellen Prozess bekomen if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0)); { LPVOID lpMsgBuf; //Puffer anlegen AnsiString ErrorMessage = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Standard Sprache (LPTSTR) &lpMsgBuf, 0, NULL ); if(ErrorMessage !="0") { MessageBoxEx(NULL,ErrorMessage.c_str(),"AdjustTokenPrivileges",MB_ICONQUESTION, MB_OK); } LocalFree(lpMsgBuf); //Puffer freigeben } }==>Eisbeer<==
-
Hat Dein Programm ein normales Vista Manifest für asInvoker?
http://blog.m-ri.de/index.php/2006/12/12/vista-und-die-notwendigkeit-eines-manifestes-fur-die-uac/
-
Ich habe eine Project1.exe.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="ExeName" type="win32"/> <description>elevate execution level</description> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges> <requestedExecutionLevel level="AsInvoker" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> </assembly>requireAdministrator funktioniert auch nicht
==>Eisbeer<==
-
Hallo...
Gibt´s eine Möglichkeit, den PrintName eines Reparse-Point´s unter Vista ohne Admin-Rechte zu erhalten ???
-
Wieso funktioniert requireAdministrator nicht? Dann bist Du Admin!
Was sagt denn GetLastError?
-
Selbst wenn man direkt als Administrator angemeldet ist, muss das Programm durch "Als Administrator ausführen" gestartet werden.
==>Eisbeer<==
-
Das solte aber requireAdministrator erledigen...
Die Frage ist was sagt GetLastError!
-
Das verstehe ich auch nicht. GetLastError sagt 0!
==>Eisbeer<==
-
Angemeldet als Standard-User: Keine Ausgabe ==>GetLastError==>0
Angemeldet als Standard-User: "Als Administrator ausführen"==>OK
Angemeldet als Administraror: "Der angeforderte Vorgang erfordert erhöhte Rechte"
Angemeldet als Administrator: "Als Administrator ausführen"==>OKGetLastError liefert IMMER 0 zurück !
==>Eisbeer<==
-
Ich hab emir jetzt Deinen Code nicht komplett angesehen, aber kennst Du diese ganzen Hinweise:
http://www.flexhex.com/docs/articles/hard-links.phtml#junctions
-
PS: Der angegebene Code stammt größtenteils von mir

Siehe:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-206238-and-postdays-is-0-and-postorder-is-asc-and-start-is-13.html
-
Mein Fazit ist:
Unter Vista geht ein:
C:\>dir /AL Volume in Laufwerk C: hat keine Bezeichnung. Verzeichnis von C:\ 02.11.2006 16:41 <VERBINDUNG> Documents and Settings [C:\Users] 17.05.2007 17:06 <VERBINDUNG> Dokumente und Einstellungen [C:\Users] 17.05.2007 17:06 <VERBINDUNG> Programme [C:\Program Files] 0 Datei(en), 0 Byteswunderbar.
Es benötigt keine Admin-Rechte, nix...
Aber ich hab noch keinen Dokumentierten Weg gefunden, wie man an diese Infos kommt, ohne das "richtige" Admin-Rechte benötigt werden...
-
kannste mal im sourcecode von dir nachgucken?
-
Klar ist mein Source auf deinen Grundlagen aufgebaut. Ich habe ja nicht behauptet, dass er aus meiner Feder stammt. Ohne deine Vorlage wäre ich jetzt nicht mal so weit...
Ich versuche ihn nur an Vista anzupassen.
Also nochmal @Jochen Kalmbach ==>
Danke
<====>Eisbeer<==
-
Ich habs gefunden:
Öffne das Verzeichnis so, dann geht es ohne Admin-Rechte:hFile = CreateFile(szMyFile, FILE_READ_EA, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
-
Respect, funktoniert ohne jegliche Privilegien und ohne Admin-Rechte.
Muss jetzt nur noch verstehen wieso (Aber erst morgen heute nichtmehr)
==>Eisbeer<==
-
Wie bist du auf die Idee gekommen ?
MSDN==>Grants the right to read extended attributes.<==Der Share-Mode ist allerdings Geschmackssache.

==>Eisbeer<==