• MediQ
  • Registratie: April 2003
  • Laatst online: 16-09 08:39
Naar aanleiding van wat informatie verschaft door alt-29 in dit topic post ik hier.

Kort samengevat: ik probeer via Windows XP Shutdown scripts een VBScript uit te voeren die controlleert of iemand verbonden is met de PC. Dit is wat ik heb tot nu toe:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Set objConnection = GetObject("WinNT://./LanmanServer")
Set colSessions = objConnection.Sessions

If (IsEmpty(colSessions) = False) Then

    pctjes = ""

    For Each objSession in colSessions
        pctjes = pctjes & objSession.Computer
    Next

    pctjes = pctjes & " is verbonden met deze computer. Wilt u het afsluiten onderbreken?" & VbCrLf & "Na 10 seconden wordt het afsluiten automatisch onderbroken."

    Set objShell = CreateObject("Wscript.Shell")
    intReturn = objShell.Popup(pctjes, 10, "Afsluiten onderbreken", 4 + 48)
    
    Select Case intReturn
    case 6      
            Msgbox "Het afsluiten wordt afgebroken."
            ' Afbreken afsluitprocedure op een of andere manier
            Msgbox "Afsluiten onderbroken"
    case -1     
            Msgbox "De 10 seconden zijn voorbij!" & VbCrLf & "Het afsluiten wordt nu afgebroken."
            ' Afbreken afsluitprocedure op een of andere manier
            Msgbox "Afsluiten onderbroken"
    End Select

End If


Zoals je kan zien mist in deze (vast niet efficiënte code :P) de manier van het afbreken van de afsluitprocedure. Na uitgebreid googlen kwam ik uit op deze thread op vbforums.com waarin over dit onderwerp gesproken wordt. De post van marcjack is ook van mij (BugMeNot account ;)), maar het kan geen kwaad het op twee verschillende fora te vragen. De code van dat forum waar ik een vraag over heb is het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    'constants needed, form level
    Private Const WM_QUERYENDSESSION As System.Int32 = &H11
    Private Const WM_CANCELMODE As System.Int32 = &H1F

    'the sub to intercept the windows messages
    Protected Overrides Sub WndProc(ByRef ex As Message)
        If ex.Msg = WM_QUERYENDSESSION Then
            'cancel the message
            Dim MyMsg As New Message
            MyMsg.Msg = WM_CANCELMODE
            MyBase.WndProc(MyMsg)
        Else
            'send the message as normal
            MyBase.WndProc(ex)
        End If
    End Sub


De vraag is nu hoe ik deze code die daar in een van de laatste posts staat in mijn code kan gebruiken. Kan iemand mij hiermee helpen?

[ Voor 3% gewijzigd door MediQ op 20-12-2007 20:48 ]


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

kijk eens naar het shutdown commando

ASSUME makes an ASS out of U and ME


  • alt-92
  • Registratie: Maart 2000
  • Niet online
H!GHGuY, daar is dat tweede stuk nou net voor ;)

Maar da's ook echt VB en geen VBScript (je hebt geen forms in VBScript, beperkter object model).

Maar je hebt wel een punt, commandline utils kan je net zogoed aanroepen:

Als alternatief zou je dus met objShell.Run("shutdown -a") kunnen werken.

Ik zou trouwens voor het tweede deel (je Case selectie) eerder iets als
VBScript:
1
2
3
4
5
6
7
8
9
 
    case -1     
            Msgbox "De 10 seconden zijn voorbij!" &_
 VbCrLf & "Het afsluiten wordt nu afgebroken."
            ' Afbreken afsluitprocedure op een of andere manier
            ObjShell.Run(shutdown -a)
            Msgbox "Te laat ! Afsluiten onderbroken," &_
"je broer is al onderweg met de deegroller"
    End Select 

maken :+

[ Voor 63% gewijzigd door alt-92 op 20-12-2007 21:29 ]

ik heb een 864 GB floppydrive! - certified prutser - the social skills of a thermonuclear device


  • MediQ
  • Registratie: April 2003
  • Laatst online: 16-09 08:39
naja, dat met shutdown heb ik eerlijk gezegd nog niet getest omdat in die thread waar ik naar link iemand het volgende zegt:
I thought the command "shutdown -a" would work. When I first tested my script, I used this command. Unfortunately, this doesn't work. I think the reason why is because shutdown -a aborts a shutdown that's initiated from the command line. Start > Shutdown doens't use the command line to shutdown. It uses the API call ExitWindowsEx. I need to use another API to abort this (or somehow intercept WM_QUERYENDSESSION and return a value of "0" ).
En ik heb het hier dus over normale reguliere shutdown. Ik weet niet zeker of dit hierboven waar is. Ik zou het wel even zelf kunnen testen ;)

edit:
"Te laat ! Afsluiten onderbroken," & "je broer is al onderweg met de deegroller"
hehe >:)

[ Voor 17% gewijzigd door MediQ op 20-12-2007 21:30 ]


  • alt-92
  • Registratie: Maart 2000
  • Niet online
Mgoed.
Even wat verder lopen spitten, en het gaat sowieso niet lukken met standaard VBScript want daar kan je geen API calls mee doen.
Wat je zou kunnen proberen is een Wrapper gebruiken, of door middel van Excel (en daar weer een VBA macro in). Excel kan je weer wel scripten.

Dat gezegd hebbende, het afbreken van een shutdown procedure is niet eenvoudig te voorkomen met een script.
Misschien kan je wel in het logoff gedeelte een vertraging inbouwen en netjes de sessies afsluiten met een duidelijke bedreiging waarschuwing naar de eindgebruiker.

ik heb een 864 GB floppydrive! - certified prutser - the social skills of a thermonuclear device


  • MediQ
  • Registratie: April 2003
  • Laatst online: 16-09 08:39
Hmm ok. Bedankt voor de moeite iig :)

Ik denk dat ik het VBS bestandje gewoon los ergens dump en mn zusje instructies geef daarmee de pc af te sluiten of iig te checken of er nog verbindingen open staan.

  • Brahiewahiewa
  • Registratie: Oktober 2001
  • Laatst online: 30-09-2022

Brahiewahiewa

boelkloedig

Mark_mastermind schreef op donderdag 20 december 2007 @ 22:43:
Hmm ok. Bedankt voor de moeite iig :)

Ik denk dat ik het VBS bestandje gewoon los ergens dump en mn zusje instructies geef daarmee de pc af te sluiten of iig te checken of er nog verbindingen open staan.
Effe een kritiese noot over die verbindingen: Lanman.sessions blijven gewoon open staan totdat de client wordt afgesloten. Met jouw script ga je dus een hoop "false positives" genereren, d.w.z. dat het script beweert dat er actieve sessies zijn, terwijl je broer allang weer wat anders zit te doen. Denk dat het beter is om de open files te tellen; moet je ook wel ergens met WMI naar boven kunnen halen

QnJhaGlld2FoaWV3YQ==


  • alt-92
  • Registratie: Maart 2000
  • Niet online
Klopt, heb je gelijk in.
Maar dat kan de topicstarter ook terugvinden in dezelfde link die hij al eerder heeft gekregen :)

ik heb een 864 GB floppydrive! - certified prutser - the social skills of a thermonuclear device


  • MediQ
  • Registratie: April 2003
  • Laatst online: 16-09 08:39
Ja daar ben ik ook achter gekomen ;) Daarom maak ik nu ook gebruik van de timeout tijd. Ik heb het hele afbreken van het afsluiten laten zitten en het slechts tot een 'controle script' omgebouwd. Hij checkt of IdleTime minder is dan 5 minuten.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
dim objConnection, colSessions, pctjes, kaas
Set objConnection = GetObject("WinNT://./LanmanServer")
Set colSessions = objConnection.Sessions

For Each objSession in colSessions
If objSession.IdleTime <= 300 Then
    pctjes = pctjes & objSession.Computer
End If
Next
    
If (pctjes <> "") Then
    pctjes = pctjes & " is verbonden met deze computer. Zet de computer nog niet uit."
    kaas = MsgBox ( pctjes, 48, "Verbonden met andere computer" )
Else 
    pctjes = "Geen verbinding gevonden met de andere computers. Je mag de computer uitzetten!"
    kaas = MsgBox ( pctjes, 64, "Geen verbinding gevonden" )
End If

Cleanup

Sub Cleanup
    Set colSessions = Nothing
    Set objConnection = Nothing
    WScript.Quit
End Sub


Dat er zoiets is als 'aantal geopende bestanden' heb ik ook gevonden bij computerbeheer, maar ik kan daar geen codedinges voor vinden.. die staat ook niet op de site die ik van alt-92 kreeg:

Microsoft Technet Scriptcenter - How Can I List Open Sessions and Open Files on a Computer?

[ Voor 16% gewijzigd door MediQ op 20-12-2007 23:37 ]


Acties:
  • 0 Henk 'm!

  • Brahiewahiewa
  • Registratie: Oktober 2001
  • Laatst online: 30-09-2022

Brahiewahiewa

boelkloedig

Als je nou de regel
VBScript:
1
kaas = MsgBox ( pctjes, 64, "Geen verbinding gevonden" )
vervangt door
VBScript:
1
2
3
4
5
6
7
8
strComputer = "."
set objWMI = getObject ( "winmgmts:{impersonationLevel=impersonate, (Shutdown)}\\" & strComputer & "\root\cimv2" )

For Each objOperatingSystem in objWMI.execQuery ( "Select * from Win32_OperatingSystem" )

     objOperatingSystem.Win32Shutdown ( 8 )

Next
dan heb je toch een keurig scriptje wat checkt of er actieve sessies zijn en - zo niet - afsluit?

offtopic:
en zo'n cleanup subroutine is volstrekt nutteloos in vbscript

QnJhaGlld2FoaWV3YQ==


Acties:
  • 0 Henk 'm!

  • MediQ
  • Registratie: April 2003
  • Laatst online: 16-09 08:39
Dank je, dat ziet er idd wel handig uit. Zo'n cleanup sub heb ik ook maar uit een andere VBScript gehaald... :)

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 09:27

Creepy

Tactical Espionage Splatterer

Oeh, VBScript en Windows. Dit lijkt me een betere kandidaat voor Windows Clients i.p.v. Programming. Zie ook Waar hoort mijn topic?.

Move -> Windows Clients

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1