2017-11-30 3 views
0

Anfangsproblem:
Ich benutze eine externe Tastatur im Büro, also möchte ich die NumLock ON. Aber wenn ich zu Hause bin, benutze ich einfach die Laptop-Tastatur, also bekomme ich Nummern statt Buchstaben und ich muss NumLock ausschalten.SendKeys funktioniert nicht von Hintergrundaufgabe

Erste Lösung: Das folgende Skript erkennt eine oder zwei Tastaturen und schaltet NumLock entsprechend ein oder aus.

Neues Problem:
Dies funktioniert perfekt von der Befehlszeile, aber ich möchte es auslösen, wenn ich mich anmelde und automatisch geschehen. Wenn ich es aus Taskplaner im Hintergrund ausführen, funktioniert diese Zeile nicht:

Es wird ausgelöst, aber nicht die Sperre umschalten. Keine Fehler gemeldet.

UPDATE: Wenn ich es unter meinem Konto "nur wenn Benutzer angemeldet ist" läuft, dann funktioniert es, aber zeigt das cmd-Fenster. Wenn ich es unter meinem Konto oder unter dem System-Konto mit "ob Benutzer angemeldet ist oder nicht" das Fenster geht schön weg, aber es funktioniert nicht.

Ob von cmd oder als geplante Aufgabe ausführen, bekomme ich diese Ausgabe, wenn er die Sperre wechseln sollte:

Microsoft (R) Windows Script Host Version 5.812 
    Copyright (C) Microsoft Corporation. All rights reserved. 

    Found HID Keyboard Device 
    Found HID Keyboard Device 
    numLock is OFF 
    Toggling Numlock 

So das Skript selbst ordnungsgemäß funktioniert.

UPDATE2: Sieht so aus, als ob es etwas damit zu tun haben könnte, keine Windows-Station zu haben, wenn es als Hintergrundaufgabe ausgeführt wird. Stellt sich heraus, dass DetectNumlockConsole.exe funktioniert auch nicht. Das ist eine einfache C# -Anwendung, die die Ergebnisse dieser Linie

numLock = Control.IsKeyLocked(Keys.NumLock);  

wieder zurückgibt, das funktioniert bei der Ausführung „nur dann, wenn Benutzer angemeldet ist“, aber nicht „ob Benutzer angemeldet ist oder nicht.“
--------- vbs Skript -----------

set OUT = WScript.StdOut   
    Set Shell=CreateObject("Wscript.Shell") 
    Dim KeyCount 
    KeyCount = 0 
    Computer = "." 
    'set NumLock = CheckState 
    Set WMIService = GetObject("winmgmts:\\" & Computer & "\root\cimv2") 
    Set Devices = WMIService.ExecQuery ("Select * From Win32_USBControllerDevice") 

    For Each Device in Devices 
     DeviceName = Device.Dependent 
     Quotes = Chr(34) 
     DeviceName = Replace(DeviceName, Quotes, "") 
     DeviceNames = Split(DeviceName, "=") 
     DeviceName = DeviceNames(1) 
     Set USBDevices = WMIService.ExecQuery ("Select * From Win32_PnPEntity Where DeviceID = '" & DeviceName & "'") 

     For Each USBDevice in USBDevices 
      'OUT.WriteLine USBDevice.Description ' Write description to command line to see what to look for 
      If InStr(LCase(USBDevice.Description), "keyboard") <> 0 Then 
       KeyCount = KeyCount + 1 
       OUT.WriteLine "Found " & USBDevice.Description 
      End If 
     Next 
    Next   

    dim numLock 
    numLock = Shell.Run("DetectNumlockConsole.exe",0,True) 

    If (numLock = 0) Then 
     OUT.WriteLine "numLock is OFF" 
    Else 
     OUT.WriteLine "numLock is ON" 
    End If 

       ' If we have a keyboard, and numlock is OFF 
       ' Or we don't have a keyboard, and numlock is ON 
       ' Then toggle it 
    If (((KeyCount > 1) AND (numLock = 0)) OR ((KeyCount = 1) AND (numLock = 1))) Then 
     Shell.SendKeys "{NUMLOCK}"  ' *** Problem here, doesn't toggle **  
     OUT.WriteLine "Toggling Numlock" 
    End If 
+0

Wie ist das eine C# bezogene Frage? –

+0

@SirRufo Das System hat das Tag vorgeschlagen, als ich die eine C# -Linie hinzugefügt habe. Ich fügte es hinzu, weil der C# -Code auch nicht funktionierte. Aber ich stimme zu, dass es nicht dazugehört. – BWhite

Antwort

0

Das ist, wie Windows-Sicherheitscenter funktioniert. Es hat nichts mit sendkeys an sich zu tun, aber Aufgaben unter verschiedenen Sicherheitskontexten können andere Aufgaben nicht beeinflussen.

Wie Sie sehen können, funktioniert es, wenn es unter dem gleichen Sicherheitskontext ausgeführt wird wie nur ausgeführt, wenn Benutzer angemeldet tut.

Es heißt Prozessisolierung und das Prinzip ist, dass niemand mit dem interaktiven Benutzer für sowohl Sicherheit und UI-Principals stören kann.

Verwandte Themen