Toon posts:

[Win32] Terminal server, ben ik console of niet?

Pagina: 1
Acties:

Verwijderd

Topicstarter
In de loop der jaren hebben we een fiks aantal interface-applicaties ontwikkeld die bv. de gegevens van een telefooncentrale doorgeven aan een hotel-programma.

Die dingen zijn niet als service opgezet, maar als gewone applicatie die in de startup van all users worden opgestart. Niks mis mee, tot de komst van TermServer en Remote Desktop. Die probeert voor iedere connectie (locaal of remote) de Startup folder uit te voeren, en dan draaien die apps dus meerdere keren. Niet echt handig voor dit soort interfaces...

Nu kan ik die interface apps wel om gaan zetten naar een service, maar dan moet ik dik 100 apps aan gaan passen, en daar zit ik niet op te wachten.

Is er een mogelijkheid om:

- Of te beperken dat items in de Startup folders alleen worden uitgevoerd wanneer via de console wordt ingelogd,

- Of binnen de applicatie te checken of 'ie is gestart vanaf de console of remote?

De applicaties zijn geschreven in Delphi, maar het maakt me niet uit in welke taal iemand een hint of oplossing kan geven. 't Gaat me om de API calls, en om een schop in de goede richting. Ik heb hier nu al uren naar zitten Googlen en msdn-en, zonder succes.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Run As Service? Je hoeft een heleboel applicaties niet te verbouwen om ze toch als service te draaien, zeker wanneer het conceptueel services zijn.

In elk geval kun je uitvogelen op welke desktop je draait. De console heeft een bijzondere naam.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:08

.oisyn

Moderator Devschuur®

Demotivational Speaker

Kun je niet gewoon een system-wide mutex oid aanmaken zodat je gewoonweg kan checken of je app al draait?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
'Run as service', daar had ik ook al aan gedacht. Maar dat is niet echt een optie, omdat je dan het frontend gedeelte kwijt bent, en de klanten zijn daar aan gewend (knippert het RX en TX icoontje? Dan is 't goed). Nieuwere interfaces heb ik wel zo geschreven (interface als service, en een watcher hulpprogramma dat de status toont), maar die 100+ oudere interfaces kan ik niet zo 1-2-3 omzetten naar een service...

Weet je ook wat die bijzondere naam is, en hoe die op te vragen is?

Verwijderd

Verwijderd schreef op woensdag 15 december 2004 @ 15:51:
- Of binnen de applicatie te checken of 'ie is gestart vanaf de console of remote?
Dat lijkt mij geen optie, aangezien je dan alsnog al die progjes moet aanpassen. Kun je ze net zo goed omzetten naar een service.

Waarom maak je niet een .bat waarin gecontroleerd wordt welke user 'm aanroept, en waarbij alleen bij één specifieke user (die alleen via console inlogged) die apps gedraaid worden? Die .bat kun je dan in je startup-folder zetten.

Verwijderd

Topicstarter
System wide mutex. Da's misschien wel een goed idee. Ik was al aan het experimenteren geweest met semaphore files (ik stam nog uit 't DOS tijdperk :)) maar die hebben als nadeel dat ze soms blijven staan terwijl de applicatie niet meer draait (stroomstoring, etc.). Mutexes zouden dat op kunnen lossen.

Goed plan, al moet ik dan nog steeds een flink aantal applicaties aanpassen. Maar als 't niet anders kan, dan moet 't maar.

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 15 december 2004 @ 17:39:
Dat lijkt mij geen optie, aangezien je dan alsnog al die progjes moet aanpassen. Kun je ze net zo goed omzetten naar een service.
Al die interfaces gebruiken eenzelfde stramien, met een groot general deel en een relatief klein interface-specifiek deel. 't Hoeft dus maar 1x in het general deel aangepast te worden (en dan 100x hercompileren...). Omzetten naar een service heeft meer voeten in de aarde, omdat zowel het general als het specifieke deel communiceert met de desktop.
Waarom maak je niet een .bat waarin gecontroleerd wordt welke user 'm aanroept, en waarbij alleen bij één specifieke user (die alleen via console inlogged) die apps gedraaid worden? Die .bat kun je dan in je startup-folder zetten.
Ze staan nu juist in 'All users' om ervoor te zorgen dat ze altijd worden opgestart.
OK, ik weet 't, het verdient geen schoonheidsprijs, en zo prog ik ze ook al lang niet meer (service + watcher werkt veel beter), maar die dingen draaien nu eenmaal...

Verwijderd

Misschien heb je hier wat aan:

http://msdn.microsoft.com...tings_isremotesession.asp

The IsRemoteSession property retrieves a Boolean value that indicates whether the Help and Support Center application is executed inside a Windows NT Server 4.0, Terminal Server Edition session.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Verwijderd schreef op woensdag 15 december 2004 @ 17:41:
System wide mutex. Goed plan, al moet ik dan nog steeds een flink aantal applicaties aanpassen.
Nee hoor, je zou ook een wrapper kunnen maken. Die wrapper krijgt een naam via de commandline (App3.exe bv), maakt een mutex aan met de naam, lockt'm en indien dat lukt, start de applicatie met die naam. Vervolgens doe je een wait op de gestarte applicatie, en unlock je de mutex na afsluiten. Dan heb je maar 1 extra utility, en die heb je ook alleen op Terminal Server nodig.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Dank allemaal, de "schop in de goeie richting" is prima gelukt.

Ik heb 't nu opgelost met een programmaatje in de startup die eerst checkt of 'ie remote draait of niet. Zo nee, dan is 'ie console, en mogen alle interfaces die bij 'm geregistreerd zijn opstarten.

De Generaal had me op dat IsRemoteSession pad gezet, alleen werkt dat pas vanaf XP/Win2003 ('t is een onderdeeltje van PCHealth).
Maar "GetSystemMetrics($1000 {SM_REMOTESESSION})" doet 't ook prima. :)

Verder heb ik systemwide mutexes toegevoegd, en dat werkt prachtig. Dan moet wel elke interface opnieuw gecompileerd worden om daar gebruik van te maken, maar met dat IsRemoteConnection wrappertje is daar de druk een beetje van de ketel.
Pagina: 1