SetFileSecurity ()
-
Ich habe folgendes Problem:
ich möchte gern ein kleine c++ programm schreiben, welches einem ordner "xy" änderungs rechte zu lesen u schreiben u löschen zusichert. folgende Benutzer sollen davon betroffen sein; Admin´s, alle Benutzer, System und Ersteller Besitzer.
Ich habe mich mit SetFileSecurity versucht.....aber leider gescheitert
#include <windows.h> #include <iostream> #include "ACLInfo.h" using namespace std; int main(int argc, TCHAR** argv) { // Check Input Arguments /* if (2 != argc) { // Output usage information in case of wrong arguments cout << "Usage: ACLInfo.exe <path to file or directory>" << endl; return 0; }*/ // Get the path from supplied arguments TCHAR* strPath = "Database"; // Declare new CACLInfo object // and initialize it with supplied path //CACLInfo objAclInfo(strPath); CACLInfo objAclInfo(strPath); // query ACL info from NTFS //objAclInfo.Query(); objAclInfo.SetRightsToUser(); // Output the ACL Info to standard output //objAclInfo.Output(cout); return 0; }
//AcIInfo.cpp #include "ACLInfo.h" #define READ_PERMISSIONS (FILE_READ_DATA | \ FILE_READ_ATTRIBUTES) #define WRITE_PERMISSIONS (FILE_WRITE_DATA | \ FILE_APPEND_DATA | \ FILE_WRITE_ATTRIBUTES | \ FILE_WRITE_EA) #define EXECUTE_PERMISSIONS (FILE_READ_DATA | \ FILE_EXECUTE) // Constructor CACLInfo::CACLInfo(_bstr_t bstrPath) { m_sAceList = NULL; m_bstrPath = bstrPath; } // Destructor CACLInfo::~CACLInfo(void) { // Free ace_list structure ClearAceList(); } // Free the nodes of ace_list void CACLInfo::ClearAceList() { ace_list* pList = m_sAceList; ace_list* pNext; while(NULL != pList) { pNext = pList->next; free(pList); pList = pNext; } m_sAceList = NULL; } HRESULT CACLInfo::SetRightsToUser() { // cout <<"Es lauft noch<<\n"; BOOL bSuccess = TRUE; BYTE* pSecDescriptorBuf; DWORD dwSizeNeeded = 0; // clear any previously queried information ClearAceList(); // Find out size of needed buffer for security descriptor with DACL // DACL = Discretionary Access Control List bSuccess = GetFileSecurityW((BSTR)m_bstrPath, DACL_SECURITY_INFORMATION, NULL, 0, &dwSizeNeeded); cout <<dwSizeNeeded<<"\n"; if (0 == dwSizeNeeded) { return E_FAIL; } pSecDescriptorBuf = new BYTE[dwSizeNeeded]; // Retrieve security descriptor with DACL information bSuccess = GetFileSecurityW((BSTR)m_bstrPath, DACL_SECURITY_INFORMATION, pSecDescriptorBuf, dwSizeNeeded, &dwSizeNeeded); // Check if we successfully retrieved security descriptor with DACL information cout<<"bSuccess =" <<bSuccess<<"\n"; if (0==bSuccess) { DWORD dwError = GetLastError(); cout << "Failed to get file security information (" << dwError << ")\n"; return E_FAIL; } SECURITY_INFORMATION si=OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION| DACL_SECURITY_INFORMATION; si|=SACL_SECURITY_INFORMATION; SECURITY_DESCRIPTOR *sd=(SECURITY_DESCRIPTOR *) &dwSizeNeeded; // if (ReadSacl) bool Neguse = TRUE; Neguse = SetFileSecurityW((BSTR)m_bstrPath,si,&dwSizeNeeded); cout<<"SetFileSecurity erfolgreich durchgefuehrt wenn (1) =" <<Neguse<<"\n"; return S_OK; } [cpp] //AcIInfo.h #pragma once #ifndef _ACL_INFO_CLASS_H #define _ACL_INFO_CLASS_H #include <iostream> #include <comdef.h> using namespace std; struct ace_list { ACE_HEADER* pAce; BOOL bAllowed; ace_list* next; }; class CACLInfo { public: // construction / destruction // constructs a new CACLInfo object // bstrPath - path for which ACL info should be queried CACLInfo(_bstr_t bstrPath); virtual ~CACLInfo(void); // Queries NTFS for ACL Info of the file/directory //HRESULT Query(); HRESULT SetRightsToUser(); // Outputs ACL info in Human-readable format // to supplied output stream //void Output(ostream& os); private: // Private methods void ClearAceList(); HRESULT AddAceToList(ACE_HEADER* pAce); private: // Member variables _bstr_t m_bstrPath; // path ace_list* m_sAceList; // list of Access Control Entries }; #endif // _ACL_INFO_CLASS_H
-
Wie äußert sich das "bin gescheitert"? (btw, wenn du in der .CPP nochmal die Deklarationen des Headers wiederholst, hilft das niemandem
Dort solltest du die Methoden deiner CACLInfo-Klasse definieren.
-
ohh Sorry,
das war ein copy and paste fehler.
in der main.cpp wird ein Ordner "Database" bearbeitet.
Ich versuche allen Benutzern im System schreibe und lese Rechte für den Ordner "Database" zu vergeben.
Nachdem ich aber das Programm ausgeführt wurde, haben immer noch nur Admin´s die Rechte auf dem Ordner "Database".
viele Grüsse
-
Auf den ersten Blick würde ich mal sagen, deine Casts sehen grauenhaft aus - du nimmst einen ANSI-String und castest ihn dann um in einen Unicode-String (und setzt damit vermutlich die Rechte für eine ganz andere Datei). Wieso nimmst du überhaupt die Unicode-Funktionen und nicht die allgemeinen GetFileSecurity() und SetFileSecurity() - und konsequent TCHAR?
PS: Was für einen Wert gibt eigentlich SetFileSecurity() zurück?
Edit:
Neguse = SetFileSecurityW((BSTR)m_bstrPath,si,&dwSizeNeeded);
Ob das gutgehen kann? SetFileSecurity() erwartet als letzten Parameter einen Security-Descriptor und keinen DWORD.
-
CStoll schrieb:
Auf den ersten Blick würde ich mal sagen, deine Casts sehen grauenhaft aus - du nimmst einen ANSI-String und castest ihn dann um in einen Unicode-String (und setzt damit vermutlich die Rechte für eine ganz andere Datei). Wieso nimmst du überhaupt die Unicode-Funktionen und nicht die allgemeinen GetFileSecurity() und SetFileSecurity() - und konsequent TCHAR?
PS: Was für einen Wert gibt eigentlich SetFileSecurity() zurück?
Edit:
Neguse = SetFileSecurityW((BSTR)m_bstrPath,si,&dwSizeNeeded);
Ob das gutgehen kann? SetFileSecurity() erwartet als letzten Parameter einen Security-Descriptor und keinen DWORD.
1. ich muss gestehen dass ich kein routine programmierer bin und den code zusammengeflickt habe.
2. das SetFileSecurity() gibt einen Hi BOOL zurück bei erfolg.
3. ich benutze jetzt GetFileSecurity() und SetFileSecurity() es geht aber immer noch nicht
4. kennst du vielleicht ein kleies bsp. programm auf das ich aufbauen könnte?
Neguse = SetFileSecurityW((BSTR)m_bstrPath,si,sd);
danke für die hilfe
-
fubu16 schrieb:
2. das SetFileSecurity() gibt einen Hi BOOL zurück bei erfolg.
Ja, das konnte ich auch schon aus der MSDN entnehmen - aber welchen Wert erhältst du als Rückgabe?
3. ich benutze jetzt GetFileSecurity() und SetFileSecurity() es geht aber immer noch nicht
Zeig mal den Code, wie er jetzt aussieht.
4. kennst du vielleicht ein kleies bsp. programm auf das ich aufbauen könnte?
Tut mir leid, mit den Security-Einstellungen kenne ich mich nicht wirklich aus. Aber vermutlich mußt du den Security Descriptor nach an deine Bedürfnisse anpassen, bevor du ihn verwenden kannst.
-
Dieser Thread wurde von Moderator/in CStoll aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
CStoll schrieb:
fubu16 schrieb:
2. das SetFileSecurity() gibt einen Hi BOOL zurück bei erfolg.
Ja, das konnte ich auch schon aus der MSDN entnehmen - aber welchen Wert erhältst du als Rückgabe?
hier bekomme ich einen Wert 0 zurück, d.h. die rechte werden nicht gesetzt....denke ich.
3. ich benutze jetzt GetFileSecurity() und SetFileSecurity() es geht aber immer noch nicht
Zeig mal den Code, wie er jetzt aussieht.
ok!
4. kennst du vielleicht ein kleies bsp. programm auf das ich aufbauen könnte?
Tut mir leid, mit den Security-Einstellungen kenne ich mich nicht wirklich aus. Aber vermutlich mußt du den Security Descriptor nach an deine Bedürfnisse anpassen, bevor du ihn verwenden kannst.
danke weiterhin für die hilfe!
//ACLInfo.h #include "ACLInfo.h" #define READ_PERMISSIONS (FILE_READ_DATA | \ FILE_READ_ATTRIBUTES) #define WRITE_PERMISSIONS (FILE_WRITE_DATA | \ FILE_APPEND_DATA | \ FILE_WRITE_ATTRIBUTES | \ FILE_WRITE_EA) #define EXECUTE_PERMISSIONS (FILE_READ_DATA | \ FILE_EXECUTE) // Constructor CACLInfo::CACLInfo(_bstr_t bstrPath) { m_sAceList = NULL; m_bstrPath = bstrPath; } // Destructor CACLInfo::~CACLInfo(void) { // Free ace_list structure ClearAceList(); } // Free the nodes of ace_list void CACLInfo::ClearAceList() { ace_list* pList = m_sAceList; ace_list* pNext; while(NULL != pList) { pNext = pList->next; free(pList); pList = pNext; } m_sAceList = NULL; } HRESULT CACLInfo::SetRightsToUser() { // cout <<"Es lauft noch<<\n"; BOOL bSuccess = TRUE; BYTE* pSecDescriptorBuf; DWORD dwSizeNeeded = 0; // clear any previously queried information ClearAceList(); // Find out size of needed buffer for security descriptor with DACL // DACL = Discretionary Access Control List bSuccess = GetFileSecurity((BSTR)m_bstrPath, DACL_SECURITY_INFORMATION, NULL, 0, &dwSizeNeeded); cout <<dwSizeNeeded<<"\n"; if (0 == dwSizeNeeded) { return E_FAIL; } pSecDescriptorBuf = new BYTE[dwSizeNeeded]; // Retrieve security descriptor with DACL information bSuccess = GetFileSecurity((BSTR)m_bstrPath, DACL_SECURITY_INFORMATION, pSecDescriptorBuf, dwSizeNeeded, &dwSizeNeeded); // Check if we successfully retrieved security descriptor with DACL information cout<<"bSuccess =" <<bSuccess<<"\n"; if (0==bSuccess) { DWORD dwError = GetLastError(); cout << "Failed to get file security information (" << dwError << ")\n"; return E_FAIL; } SECURITY_INFORMATION si=OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION| DACL_SECURITY_INFORMATION; si|=SACL_SECURITY_INFORMATION; SECURITY_DESCRIPTOR *sd=(SECURITY_DESCRIPTOR *) &dwSizeNeeded; // if (ReadSacl) bool Neguse = TRUE; Neguse = SetFileSecurityW((BSTR)m_bstrPath,si,sd); cout<<"SetFileSecurity erfolgreich durchgefuehrt wenn (1) =" <<Neguse<<"\n"; return S_OK; }