Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[vb.net] service extern programma onder administrator

Pagina: 1
Acties:

  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 17:34
heb een controle service geschreven die elke morgen checkt of een SysteemScheduler en een client programma draaien. Zoniet start hij ze weer op met deze code:

code:
1
2
3
4
5
6
7
8
        p = Process.GetProcessesByName("WScheduler")
        If p.Count = 0 Then

            startInfo.CreateNoWindow = False            
            startInfo.WorkingDirectory = "C:\Program Files\SystemScheduler\"
            startInfo.FileName = "WScheduler.exe"
            Process.Start(startInfo)
        End If


Zoniet, dat start hij de programma's dus weer op.

problemen die met elkaar samen hangen:
- standaard draait de service onder SYSTEM account met wel "Allow service to interact with desktop" zodat er wel forms geopend kunnen worden.

- echter de SystemScheduler en Client.exe worden nu ook opgestart onder naam account SYSTEM ipv van Gebruiker. Dit zorgt voor problemen als bv de SystemScheduler iets wil benaderen van een Network Drive (Z:\script.bat bv) omdat SYSTEM hier geen rechten op heeft...


Heb geprobeerd om process anders te starten:
startInfo.UserName = "Administrator"

(geen password ingevuld want deze heeft leeg password...)

Echter loopt de service hier op vast...

Kan ik wel een onder andere naam een applicatie starten en die ook interactie kan hebben met desktop?


Ik weet dat er een lapmiddel is om in de service een BAT file aan te roepen die het opstarten verzorgt, maar dit vind ik echt maar een lapmiddel..

EDIT
kennelijk is dit nauwelijks mogelijk, ik herschrijf de service denk ik naar een TrayApp..

[ Voor 3% gewijzigd door trekker22 op 14-06-2013 12:53 ]


  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

trekker22 schreef op vrijdag 14 juni 2013 @ 12:16:
heb een controle service geschreven die elke morgen checkt of een SysteemScheduler en een client programma draaien. Zoniet start hij ze weer op met deze code:

code:
1
2
3
4
5
6
7
8
        p = Process.GetProcessesByName("WScheduler")
        If p.Count = 0 Then

            startInfo.CreateNoWindow = False            
            startInfo.WorkingDirectory = "C:\Program Files\SystemScheduler\"
            startInfo.FileName = "WScheduler.exe"
            Process.Start(startInfo)
        End If
Volgens mij maak je hier een denkfout. Met Process.GetProcessesByName vraag je draaiende processen op. Wat jij wilt is een service starten en dat is niet helemaal hetzelfde. Lees dit er eens op na, gaat weliswaar over herstarten van een service, maar dat is niet veel anders.

Misschien dat het zo beter werkt:

code:
1
2
3
4
5
        p = Process.GetProcessesByName("WScheduler")
        If p.Count = 0 Then
                Dim sc As ServiceController = New ServiceController("WScheduler")
                sc.Start()
        End If

  • Whatson
  • Registratie: Februari 2010
  • Niet online
Wat je wilt is eigenlijk dat SYSTEM je huidige gebruiker impersonate. Met de volgende class kun je dat voor elkaar krijgen:
http://www.codeproject.co...User-Impersonation-in-NET

(heb je wel de username en password voor nodig, maar dit kun je oplossen door een dummy gebruiker aan te maken die ook bij die netwerkmappen kan.)

[ Voor 17% gewijzigd door Whatson op 16-06-2013 20:21 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Does this operation work when impersonating? The default answer is NO

Ik zie niet waarom dit überhaupt als een service zou moeten draaien, en als je er dan toch op staat, maak dan een applicatie die onder de gebruikeraccount communiceert met de service. Maar zoals ik al zei zie ik heel 't nut van die service niet als je die paar kleinigheidjes ook gewoon in de applicatie kunt bouwen. De "Allow service to interact with desktop" is zelfs eigenlijk al een vieze hack om backward compatible te blijven met prehistorische windows versies; AFAIK wordt 't dan ook al jaren afgeraden door MS maar ik kan zo snel de bron niet (meer) vinden. Er is natuurlijk wel een reden voor dat je dat vinkje al niet eens meer programmatisch kunt zetten maar dat dat via de UI moet.

[ Voor 31% gewijzigd door RobIII op 17-06-2013 09:13 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 17:34
Vinkje kan wel programmatisch via sc create!

Maar na veel lezen ook wel in de gaten dat dit niet perfect dus. Dus toch maar een tray app met timer gemaakt die hetzelfde doet!

  • PolarBear
  • Registratie: Februari 2001
  • Niet online
heb een controle service geschreven die elke morgen checkt of een SysteemScheduler en een client programma draaien.
Je bent er van op de hoogte dat Windows een taskscheduler heeft?

  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 17:34
PolarBear schreef op maandag 17 juni 2013 @ 08:37:
[...]

Je bent er van op de hoogte dat Windows een taskscheduler heeft?
ja maar die werkt niet geheel correct onder vmware :)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
trekker22 schreef op maandag 17 juni 2013 @ 10:07:
[...]

ja maar die werkt niet geheel correct onder vmware :)
Want :?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Mint
  • Registratie: Mei 2005
  • Laatst online: 22:36
RobIII schreef op zondag 16 juni 2013 @ 22:10:
De "Allow service to interact with desktop" is zelfs eigenlijk al een vieze hack om backward compatible te blijven met prehistorische windows versies; AFAIK wordt 't dan ook al jaren afgeraden door MS maar ik kan zo snel de bron niet (meer) vinden. Er is natuurlijk wel een reden voor dat je dat vinkje al niet eens meer programmatisch kunt zetten maar dat dat via de UI moet.
Jij refereert hiernaar (denk ik), en dan met name dit stukje:
Services cannot directly interact with a user as of Windows Vista. Therefore, the techniques mentioned in the section titled Using an Interactive Service should not be used in new code.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
RobIII schreef op zondag 16 juni 2013 @ 22:10:
Does this operation work when impersonating? The default answer is NO

Ik zie niet waarom dit überhaupt als een service zou moeten draaien, en als je er dan toch op staat, maak dan een applicatie die onder de gebruikeraccount communiceert met de service. Maar zoals ik al zei zie ik heel 't nut van die service niet als je die paar kleinigheidjes ook gewoon in de applicatie kunt bouwen. De "Allow service to interact with desktop" is zelfs eigenlijk al een vieze hack om backward compatible te blijven met prehistorische windows versies; AFAIK wordt 't dan ook al jaren afgeraden door MS maar ik kan zo snel de bron niet (meer) vinden. Er is natuurlijk wel een reden voor dat je dat vinkje al niet eens meer programmatisch kunt zetten maar dat dat via de UI moet.
De reden is heel simpel: op servers is er vaak uberhaupt geen desktop. Services meldingen laten geven op de desktop is een no-no; daarvoor heb je een eventlog. Als je programma interactie nodig heeft met een gebruiker dan is het gewoon geen service.

https://niels.nu

Pagina: 1