Kommunikation(shared-mem)Dienst und prog(!admin, kann desswegen shared-mem nich öffnen :( )



  • Hi all,
    da ich in dem diesen hier ähnelndem Thread keine verwirrung stiften will kappsel ich mich mal ab...

    Ich habe einen Lokalen Admin, und einen User in der Domaine.
    Ich bin mit dem User aus der Domaine auf meinem Computer eingeloggt und habe keine Adminrechte.
    Ich lese SMART parameter aus, das geht in Vista nur noch als Admin soweit ich weiß, und bei mehr als XX% benutztem reservierten Speichersektoren soll eine Email gesendet werden.
    Hierzu muss ich der User aus der Domaine sein, sonst erkennt mich der Mailserver nicht.
    Also habe ich zwei Programme, eins im Admin-Modus und eins als Domaineuser.

    Ich habe mir gedacht das ein Programm in einen geteilten Speicherbereich eine 1 schreibt und das andere diese Ziffer ausliest und bei der 1 halt ne Mail sendet.
    Dies klappt ganz gut. Allerdings soll das Mail-Programm diesen Speicherbereich wieder auf 0 setzen.

    Hier ist der Haken. Um in diesen Speicher zu schreiben muss ich Admin sein, dann wiederum kann ich keine Mail senden, und dann ist alles umsonst. 😃

    Schwer zu lesen hoffentlich verständlich 😉
    Kennt wer einen Workarround?
    Eine lösung?

    Ansi C
    Konsolenprogrammierung


  • Mod

    Wie legst Du die memory mapped file an?
    Du hast vermutlich NULL für die Security Attribute angegeben.

    Hatten wir das nicht gerade erst mit Named Pipes, das problem ist uter Vista identisch:
    http://blog.m-ri.de/index.php/2007/02/21/uac-und-createnamedpipe-mit-lpsecurityattributesnull/



  • War deine Aussage mit named-pipes auf mich bezogen?

    Ich habe mal mit Pipes gearbeitet ja... aber die bringen mir hier nichts, da ich das programm ja nicht aus dem Admin-Prog aufrufen kann/darf...

    Du bist ein freak vom fach ehrlich(nicht negativ)
    Das mit diesen DACL habe ich noch nie gepielt, man sollte keine eigenen machen, aber die Vorhandenen sind auch nirgends gelistet...

    //prog 1
    int main( void )
    	//Diese Funktion schreibt in einen geteilten Speicherbereich, wenn dieser Speicherbereich beschrieben ist, wird aus einem anderen Programm eine
    	//Email gesendet.
    {
    	HANDLE		shareMem = 0;//handle zum Speicher
    	LPTSTR		buff; //unbekannt
    
    	shareMem = 	CreateFileMapping(
    					INVALID_HANDLE_VALUE,   //geteileter Speicher
    					NULL,					//std security attributes
    					PAGE_READWRITE,			//lese und schreibzugriff
    					0,						//maximale größe des objekts
    					buffSize,				//buffergröße
    					buffName				//buffername
    				);
    	if( NULL != shareMem )
    	{
    		buff = 	(LPTSTR)MapViewOfFile(		//"verbindungsaufbau" zu shared-mem
    					shareMem,				//handle zu dem Speicher
    					FILE_MAP_ALL_ACCESS,	//zugriffsrechte
    					0,						//word's high-order offset
    					0,						//word's low-order offset
    					buffSize				//größe des speichers/zu schreibenden buffers
    				);
    		if( NULL != buff )
    		{
    			CopyMemory(					//kopiert einen speicherbereich zu einem anderen
    				(PVOID)buff,			//startadresse des ziel-speicherbereiches
    				TEXT("1"),				//startadresse des source-speicherbereiches
    				strlen( TEXT("1") )		//größe des source-speicherbereiches
    			);
    			system( "pause" );
    
    			UnmapViewOfFile( buff );	//"verbindungsabbau" zu shared-mem
    			CloseHandle( shareMem );
    		}
    		else
    			printf( "MapViewOfFile: %d\n", GetLastError() );
    	}
    	else
    		printf( "CreateFileMapping: %d\n", GetLastError() );
    }
    
    //prog2
    BOOL shouldSend( void )
    {
    	HANDLE		shareMem = 0;//handle zum Speicher
    	LPTSTR		buff; //unbekannt
    	BOOL		retValue = FALSE;
    
    	shareMem = 	OpenFileMapping(
    					FILE_MAP_WRITE,			//lesezugriff
    					FALSE,					//namen nicht vererben
    					buffName				//buffername
    				);
    	if( NULL != shareMem )
    	{
    		buff = 	(LPTSTR)MapViewOfFile(		//"verbindungsaufbau" zu shared-mem
    					shareMem,				//handle zu dem Speicher
    					FILE_MAP_WRITE,			//zugriffsrechte
    					0,						//word's high-order offset
    					0,						//word's low-order offset
    					buffSize				//größe des speichers/zu schreibenden buffers
    				);
    		if( NULL != buff )
    		{
    			if( '1' == buff[0] )
    				retValue = TRUE;
    
    			CopyMemory(					//kopiert einen speicherbereich zu einem anderen
    				(PVOID)buff,			//startadresse des ziel-speicherbereiches
    				TEXT("0"),				//startadresse des source-speicherbereiches
    				strlen( TEXT("0") )		//größe des source-speicherbereiches
    			);
    
    			UnmapViewOfFile( buff );	//"verbindungsabbau" zu shared-mem
    			CloseHandle( shareMem );
    		}
    		else
    			printf( "MapViewOfFile: %d\n", GetLastError() );
    	}
    	else
    		printf( "OpenFileMapping: %d\n", GetLastError() );
    
    	return retValue;
    }
    

    reicht dir das?
    Viel mehr ist das ja nich 🙂



  • Du hast vermutlich NULL für die Security Attribute angegeben



  • rofler schrieb:

    Du hast vermutlich NULL für die Security Attribute angegeben

    Danke für deinen Post aber er bringt mir nichts.
    Ja ich arbeite mit Security_Attribute == NULL aber ich wüsste auch nicht es anders zu machen.
    In Martins Blog steht man soll DACLs benutzen aber ich hatte ihn schon gefragt wie man damit umgeht, bei MSDN steht mann solle sie nicht verändern.


  • Mod

    Wie soll man Dir ncoh helfen? 👎
    In meinem Blog steht alles!!!

    lippoliv schrieb:

    Ja ich arbeite mit Security_Attribute == NULL aber ich wüsste auch nicht es anders zu machen.

    In dem Du eben einen angibst!!!

    lippoliv schrieb:

    In Martins Blog steht man soll DACLs benutzen aber ich hatte ihn schon gefragt wie man damit umgeht, bei MSDN steht mann solle sie nicht verändern.

    Eben!
    In meinem Blog steht Code! Dort wird eine Pipe erzeugt. Dort wird eine DACL angegeben für den Zurgiff auf Everyone. Und es steht sogar noch eine Erklärung drin warm und wieso...

    Und wo bitte steht, dass man die DACL nicht verändenrt soll?
    Wenn man ein Objekt anlegt im OS dann muss man ihm zuweisen wer welche Rechte darauf hat! Du gibst nichts an, also gelten Default Rechte. Die sind aber unter Vista nicht brauchbar! Schon gar nicht wenn ein Prozess evlevated läuft.



  • Ich bin mit einem Teil diener aussage nicht einverstanden.

    Martin Richter schrieb:

    In meinem Blog steht Code! Dort wird eine Pipe erzeugt.

    Du hast mir einen Link gegeben wo steht dass man nicht NULL angeben soll, aber Code... Sry aber den sehe ich da nicht...

    Martin Richter schrieb:

    Und wo bitte steht, dass man die DACL nicht verändenrt soll?

    Ich bin der Meinung das bei MSDN gelesen zu haben, weil die von System zu System unterschiedlich sein können, kann sein das ich es nur falsch verstanden habe!?

    Martin Richter schrieb:

    Du gibst nichts an, also gelten Default Rechte.

    Defaultrechte sind auf das System bezogen oder die Defaultrechte des Users den ich angebe, denn letzteres währe das was ich erwartet und gebraucht hätte...

    Ich bin noch immer nicht sooo in der Materie Vista und Pro-Coding tut mir leid.
    Wenn du einen Link hast der deiner Meinung nach DACL bei MSDN vernünftig erklärt währ ich dankmar 😉

    Martin Richter schrieb:

    Wie soll man Dir ncoh helfen? 👎

    Es tut mir leid wenn ich mich manchmal echt doof anstelle aber ich verstehe manches halt nicht, währ in deinem Blog der erwähnte codesnippet währe ich glaub ich nicht auf sone Frage gekommen 😞

    [edit]Wo kann ich den in CreateProcessWithLogonW das attribute mit übergeben?
    weil

    int main( void )
    {
    	SECURITY_DESCRIPTOR mySecDesc;
    	SECURITY_ATTRIBUTES mySecAttr;
    
    	InitializeSecurityDescriptor(
    		&mySecDesc,						//pointer to the sec.desc.
    		SECURITY_DESCRIPTOR_REVISION
    	);//initialisieren des neuen security_descriptor
    	SetSecurityDescriptorDacl(
    		&mySecDesc,						//pointer to the sec.desc.
    		TRUE,							//use the last two arguments
    		NULL,							//all access to the oject
    		FALSE							//specify directly to the user
    	);//(er)setzen der DACL(discretionary access control list)
    	mySecAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
    	mySecAttr.lpSecurityDescriptor = (PVOID)&mySecDesc;
    	mySecAttr.bInheritHandle = FALSE;
    
    	myStartInfo.cb = sizeof(STARTUPINFO);
    	retValue = 	CreateProcess(
    					NULL,			//program name
    					"prog.exe",		//like system( "command" )
    					&mySecAttr,			//process security attributes
    					NULL,			//primary thread security attributes
    					FALSE,			//inherited handles
    					0,				//creation flags
    					NULL,			//use parents enviroments
    					NULL,			//use parents current direction
    					&myStartInfo,
    					&myProcessInfo
    				);
    

    Funktioniert nicht, immer noch kein Admin(obwohl das sec.attr. dafür doch da ist oder? uiui ich glaub ich bin schon wieder voll am Ziel vorbei...)
    Das DACL bestimmt doch was ich tun und lassen darf oder?



  • Hi all,

    das ganze hat sich weitgehend geändert.
    Geschrieben wird aus einem Dienst, der im Adminmodus läuft.

    Gelesen werden soll aus einem Programm, das mit Userrechten, per autostart läuft.
    Sowohl der Dienst, als auch das Programm beenden sich nach lesen/schreiben + einem Zeitintervall.

    Das Leseprogramm checkt alle 10sekunden ob in dem Speicherbereich eine 1 steht, der Schreibdienst wartet nach dem schreiben 12sekunden und beendet sich dann.

    Das Leseprogramm wirft mir immer GetLastError() 5 zurück. Keine Zugriffsrechte, ich hatte es zwischendrinn aber am laufen, sodass es funktioniert hatte, da war aber kein Dienst im spiel.

    So sieht das schrieben aus:

    void schreiben( void )
    {
    	HANDLE		shareMem = 0;//handle zum Speicher
    	LPTSTR		buff; 
    	BOOL		retValue = FALSE;
    
    	shareMem = 	CreateFileMapping(
                        INVALID_HANDLE_VALUE,	//geteileter Speicher
                        NULL,					//std security attributes
                        PAGE_READWRITE,			//lese und schreibzugriff
                        0,						//maximale größe des objekts
                        buffSize,				//buffergröße
                        buffName				//buffername
                    ); 
    	if( NULL != shareMem )
    	{
    		buff = 	(LPTSTR)MapViewOfFile(		//"verbindungsaufbau" zu shared-mem
    					shareMem,				//handle zu dem Speicher
    					FILE_MAP_WRITE,			//zugriffsrechte
    					0,						//word's high-order offset
    					0,						//word's low-order offset
    					buffSize				//größe des speichers/zu schreibenden buffers
    				);
    		if( NULL != buff )
    		{
    			CopyMemory(                    //kopiert einen speicherbereich zu einem anderen
                    (PVOID)buff,            //startadresse des ziel-speicherbereiches
                    TEXT("1"),                //startadresse des source-speicherbereiches
                    strlen( TEXT("1") )        //größe des source-speicherbereiches
                );
    
    			Sleep( 12000 );
    
                UnmapViewOfFile( buff );    //"verbindungsabbau" zu shared-mem
                CloseHandle( shareMem ); 
    		}
    		else
    			writeToLog( "MapViewOfFile:\t\t", GetLastError(), 0 );
    	}
    	else
    	{
    		if( 2 != GetLastError() )
    			writeToLog( "CreateFileMapping:\t\t", GetLastError(), 0 );
    	}
    }
    

    und so das lesen:

    BOOL lesen( void )
    {
    	HANDLE		shareMem = 0;//handle zum Speicher
    	LPTSTR		buff; 
    	BOOL		retValue = FALSE;
    
    	shareMem = 	OpenFileMapping(
    					FILE_MAP_READ,			//lesezugriff
    					FALSE,					//namen nicht vererben
    					buffName				//buffername
    				);
    	if( NULL != shareMem )
    	{
    		buff = 	(LPTSTR)MapViewOfFile(		//"verbindungsaufbau" zu shared-mem
    					shareMem,				//handle zu dem Speicher
    					FILE_MAP_READ,			//zugriffsrechte
    					0,						//word's high-order offset
    					0,						//word's low-order offset
    					buffSize				//größe des speichers/zu schreibenden buffers
    				);
    		if( NULL != buff )
    		{
    			if( '1' == buff[0] )
    				retValue = TRUE;
    
    			UnmapViewOfFile( buff );	//"verbindungsabbau" zu shared-mem
    			CloseHandle( shareMem );
    		}
    		else
    			writeToLog( "MapViewOfFile:\t\t", GetLastError(), 0 );
    	}
    	else
    	{
    		if( 2 != (lastErr = GetLastError()) )
    			writeToLog( "OpenFileMapping:\t\t", GetLastError(), 0 );
    	}
    
    	return retValue;
    }
    

    Wieso muss ich mit dem Leseprogramm auch admin sein, ging früher auch ohne!
    Was habe ich falsch gemacht? Ich bin gerade nicht in der lage den Fehler zu finden...

    Es ist ne weile her, seit ich das letzte mal daran gearbeitet habe, desswegen glaube ich nur noch zu wissen, dass es geklappt hat, denn ich habe mich gefreut xD

    Sieht jemadn auf die schnelle einen fehler?
    Ich erwarte keinen code, nur einen lösungsansatz, ihr sollt ja schließlich nicht meine Arbeit machen xD

    Danke im voraus, ihr seid Spitze 😉

    [eidt]der Dienst ist nun Systemuser und das Prog normaler user.

    TCHAR buffName[] = TEXT("Global\\SyDMem");
    

    [edit2]Ich habe viel code verloren, war da was mit Security attributes und so?

    [edit3]ja es hat gefehlt. danke für die ganze hilfe



  • Ich sehe nicht ein wieso irgendein Mail Server eine Connection nicht annehmen sollte, nur weil irgendein Programm als lokaler Admin und nicht als Domänenuser eingeloggt ist.
    Ansonsten: du kannst ja einfach die SMART Werte in den shared memory Bereich schreiben, und alles andere in das Programm verlagern welches die Mail schicken soll. Dann musst du nixmehr auf Null setzen - schliesslich kann sich ja das Mail-Sende-Programm selbst merken dass es schon eine Mail geschickt hat.



  • hustbaer schrieb:

    Ich sehe nicht ein wieso irgendein Mail Server eine Connection nicht annehmen sollte, nur weil irgendein Programm als lokaler Admin und nicht als Domänenuser eingeloggt ist.

    Er kennt ganz einfach den benutzer nicht. Dies ist ein Lokaler Mailserver von meiner Firma xD

    hustbaer schrieb:

    Ansonsten: du kannst ja einfach die SMART Werte in den shared memory Bereich schreiben, und alles andere in das Programm verlagern welches die Mail schicken soll.

    Ich brauche die SMART Werte an sich garnicht. Ich brauche nur zu wissen wieviele reservierte Sektoren genutzt sind. Sind es mehr als 50% wird eine Standartmail versendet.

    hustbaer schrieb:

    Dann musst du nixmehr auf Null setzen - schliesslich kann sich ja das Mail-Sende-Programm selbst merken dass es schon eine Mail geschickt hat.

    Genau das darf man nie machen, setzt du diesen parameter auf NULL brauch das Progi was den Shared-Mem öffnet, die selben Rechte wie das Progi was ihn erstellt.
    Ist das Erstell-Progi nun aber mit adminrights bestückt, hast du als norml-user nen Prob.

    Habich deine Antwort jetzt falsch verstanden und finde einfach den Verbesserungsvorschlag nicht? 🙂



  • @lippoliv:
    Ok. Wieso möchtest du denn die Variable im Shared-Memory-Bereich mit 0 überschreiben?
    Beantworte mir diese Frage, dann kann ich dir sagen ob das was ich mir vorstelle funktionieren kann oder nicht.

    Andere Möglichkeit: nimm eine Datei (ohne Memory-Mapping), und sieh zu dass die eine passende ACL hat. (Kannst du ja einfach über den Explorer reinklicken).


Anmelden zum Antworten