SecurityDescriptor



  • Hallo,

    ich spiele gerade etwas mit den ACE ACL usw. Jetzt hab ich mir mal folgendes kleines Programm geschrieben:

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    {
        DWORD dwRet=0;
        getSecurityPriv();
        iOvertakeSecurity("C:\\temp", "C:\\test");
        dwRet=GetLastError();
        return 0;
    }
    int iOvertakeSecurity(char *pcSource, char *pcDestination)
    {
    	Dword dwResult = 0;
    	static byte buf[65536];
    	char cMessage[1220]= {0};
    
    	if (!GetFileSecurity(pcSource,
    		DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION, 
    		(SECURITY_DESCRIPTOR *) &buf[0],
    		sizeof buf,
    		&dwResult))
    	{
    		return 1;
    	}
    	if (!SetFileSecurity(pcDestination,
    	   DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION, 
    		(SECURITY_DESCRIPTOR *) &buf[0]))
    	{
    		return 2;
    	}
    	LocalFree(&buf[0]);
    
    	return 0;
    }
    
    int getSecurityPriv( void )
    {
    	HANDLE hToken;
    	LUID privValue;
    	TOKEN_PRIVILEGES tkp;
    	DWORD rc = 0;
    
    	if ( OpenProcessToken( GetCurrentProcess(),
    		TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
    	{
    		if ( LookupPrivilegeValue( NULL, SE_SECURITY_NAME, &privValue ) )
    		{
    			tkp.PrivilegeCount = 1;
    			tkp.Privileges[0].Luid = privValue;
    			tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
    			if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
    				rc = GetLastError();
    		}
    		else
    			rc = GetLastError();
    	}
    	else
    	{
    		rc = GetLastError();
    		hToken = INVALID_HANDLE_VALUE;
    	}
    
    	if ( hToken != INVALID_HANDLE_VALUE )
    		CloseHandle( hToken );
    
    	if ( rc )
    		SetLastError( rc );
    
    	return rc == 0;
    }
    

    Ich bekomm immer ERROR_INVALID_OWNER (1307L) als letzten Error zurück, was soviel heißt wie "Diese Sicherheitskennung kann nicht als Besitzer des Objekts zugeordnet werden. (0x51b)". 😕 Mein Quellverzeichnis, wo ich mir den Owner herhole, und mein Zielverzeichnis, was ich ändern will, sind doch auf meinem lokalen System, wieso kann dann dieser Owner nicht "kopiert" werden?
    Einer ne Idee?
    Bin für alles Dankbar.

    Gruß Damion



  • Hallo,

    hat sich erledigt. Ich hatte nicht genügend Privilegien. Man braucht noch die Privilegien SE_RESTORE_NAME und SE_SECURITY_NAME.

    Gruß Damion


Anmelden zum Antworten