vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB & Windows API
VBA Access Desktoplocking Programm 
Autor: Zupa
Datum: 07.01.12 18:05

Hallo,

Ja, ich arbeite schon Wochen an diesem Thema und habe ausführlich in vielen Foren gesucht. Leider haben alle (auch die viel versprechenden) Tipps bisher nicht weiter geholfen.

Ich schreibe an einem Programm für Access, das ohne Logoff oder Computerneustart in einen Kioskmodus versetzt werden kann. (Zwar muss Eingabe erfolgen können, aber niemand soll ohne entsprechendes Password auf Desktop, Dateien, Programme, etc. zugreifen können)

Meiner Vermutung nach ist ein globaler LL-Hook (SetWindowsHookEx) zu einfach zu umgehen (vermutliche Schwachstellen: Autostart, BalloonTipps, taskplaner oder ähnliches). Wenn diese Vermutungen absolut unbegründet sein sollten, unterrichtet mich bitte! (Möglicherweise ist eine Verbindung mit einem CBT-Hook sinnvoll?)
Achso: Taskmanager, Abmeldefunktion, und ähnliche "Windows-Sicherheit"sdienste können ja leicht in der Registry ausgechaltet werden (Auch ohne Neustart!, CTRL+ALT+DEL ist also umgangen).

Falls euch noch keine genialen Ideen gekommen sind, wie man es machen könnte (gerne auch ohne die unten Aufgeführten Ansätze), dann hier mal mein bisheriger Code:

Mein Versuch, über createdesktop und switchdesktop einen Desktop ohne Shell zu öffnen - was auch ausgezeichnet funktioniert, kein Wunder - verfolgt besonders diese zwei Ansätze:
(Ich hoffe, dass ich nicht auch mit SECURITY_ATTRIBUTES meines Prozesses rumspielen muss, das sieht merkwürdig aus auf den Seiten von MSDN. Aber wenn es hier einen Meister (oder auch eine Meisterin) gibt, mich klüger zu machen, bitte!)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VBA Access Desktoplocking Programm 
Autor: Zupa
Datum: 07.01.12 18:06

1) CreateThread der ein Formular auf dem neuen Desktop öffnen soll. Die SetThreadDesktop Funktion ist erfolgreich, aber weder DoCmd.OpenForm noch ShowWindow (KioskFormHandle, SW_NORMAL) zeigen das Formular auf dem neuen Desktop an.
'Modul:
Option Explicit
 
'API Deklarationen
Private Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As _
  Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal _
  lParameter As Long, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
Private Declare Function CreateDesktop Lib "user32" Alias "CreateDesktopA" ( _
ByVal lpszDesktop As Long, ByVal lpszDevice As Long, pDevmode As Any, ByVal _
dwFlags As Long, ByVal dwDesiredAccess As Long, lpsa As Any) As Long
Private Declare Function SwitchDesktop Lib "user32" (ByVal hDesktop As Long) As _
Long
Private Declare Function GetThreadDesktop Lib "user32" (ByVal dwThread As Long) _
As Long
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Private Declare Function GetCurrentThread Lib "kernel32" () As Long
Private Declare Function OpenInputDesktop Lib "user32" (ByVal dwFlags As Long, _
  ByVal fInherit As Boolean, ByVal dwDesiredAccess As Long) As Long
Private Declare Function SetThreadDesktop Lib "user32" (ByVal hDesktop As Long) _
As Long
Private Declare Function CloseDesktop Lib "user32" (ByVal hDesktop As Long) As _
Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As _
Long
Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, _
ByVal dwExitCode As Long) As Long
Private Declare Function GetExitCodeThread Lib "kernel32" (ByVal hThread As _
Long, lpExitCode As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal _
nCmdShow As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 
'Konstanten
Private Const SW_HIDE = 0
Private Const SW_NORMAL = 1
 
'Typen
Private Enum DESKTOP_ACCESS_MASK
DESKTOP_DELETE = &H10000
DESKTOP_WRITE_DAC = &H40000
DESKTOP_WRITE_OWNER = &H80000
DESKTOP_NONE = 0
DESKTOP_READOBJECTS = &H1
DESKTOP_CREATEWINDOW = &H2
DESKTOP_CREATEMENU = &H4
DESKTOP_HOOKCONTROL = &H8
DESKTOP_JOURNALEDRECORD = &H10
DESKTOP_JOURNALEDPLAYBACK = &H20
DESKTOP_ENUMERATE = &H40
DESKTOP_WRITEOBJECTS = &H80
DESKTOP_SWITCHDESKTOP = &H100
GENERIC_ALL = (DESKTOP_DELETE Or DESKTOP_WRITE_DAC Or DESKTOP_WRITE_OWNER Or _
  DESKTOP_READOBJECTS Or DESKTOP_CREATEWINDOW Or DESKTOP_CREATEMENU Or _
  DESKTOP_HOOKCONTROL Or DESKTOP_JOURNALEDRECORD Or DESKTOP_JOURNALEDPLAYBACK _
  Or DESKTOP_ENUMERATE Or DESKTOP_WRITEOBJECTS Or DESKTOP_SWITCHDESKTOP)
GENERIC_SPECIFIC = (DESKTOP_CREATEWINDOW Or DESKTOP_SWITCHDESKTOP)
End Enum
 
'Variablen
Private hWnd As Long 'WindowHandle
Private hThread As Long 'ThreadHandle
Private ThreadId As Long 'ThreadID
 
Private D As Long 'NewDesktopHandle
Private oldDT As Long 'oldDesktopThreadHandle
Private oldDI As Long 'oldInputDesktopHandle
 
'Funktionen
Private Function StartDelegate()
'Speichere Handles
oldDT = GetThreadDesktop(GetCurrentThreadId())
oldDI = OpenInputDesktop(1, True, GENERIC_ALL)
 
'Neuer Desktop
D = CreateDesktop(StrPtr("MDeskKiosk"), ByVal 0&, ByVal 0&, 1, GENERIC_ALL, _
  ByVal 0&)
 
'Verschiebe Thread
If SetThreadDesktop(D) = 0 Then
    MsgBox err.LastDllError
    Exit Function
Else:
    SwitchDesktop D
End If
 
 
'*****************
'Diese Beiden Methoden funktionieren nicht: (keine Fehlermeldung, es passiert 
' einfach  NICHTS)
DoCmd.OpenForm "Kiosk", acNormal
 
' ODER:
ShowWindow hWnd, SW_NORMAL
'*****************
 
Do While CurrentProject.AllForms("Kiosk").IsLoaded
    'ShowWindow hWnd, SW_NORMAL 'verzweifelter Versuch...
    DoEvents
    Sleep 500
Loop
 
 
End Function
 
Public Function Master(Handle As Long) 'Wird von Form über "Master Me.HWND" _
  gerufen
'speichere Hanlde
hWnd = Handle
 
'neuer Thread
hThread = CreateThread(ByVal 0&, 0&, AddressOf StartDelegate, 0&, 0&, ThreadId)
 
'gehe sicher, dass Form geladen ist
Do While Not CurrentProject.AllForms("Kiosk").IsLoaded
    DoEvents
    Sleep 500
Loop
 
'warte, bis Form geschlossen ist
Do While CurrentProject.AllForms("Kiosk").IsLoaded
    DoEvents
    Sleep 500
Loop
 
'Und alles auf Anfang
DestroyThread
SwitchDesktop oldDI
CloseDesktop D
CloseHandle D
 
End Function
 
Private Function DestroyThread() 'beende Thread, lösche Handles 
Dim hExit As Long
GetExitCodeThread hThread, hExit
If TerminateThread(hThread, hExit) = 0 Then
    MsgBox err.LastDllError
Else
    CloseHandle hThread
End If
End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VBA Access Desktoplocking Programm 
Autor: Zupa
Datum: 07.01.12 18:09

Entschuldigt, Falsche Klammerung...

Beitrag wurde zuletzt am 07.01.12 um 18:13:31 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VBA Access Desktoplocking Programm 
Autor: Zupa
Datum: 07.01.12 18:10

2) CreateProcess soll entweder eine temporäre DB (während Runtime erzeugt) öffnen oder eine Batch-datei, die genau das übernimmt (Schema: CreateProcess "cmd.exe", "/c " & Batchdatei, ...). CreateProcess gibt mir auch wunderbare Handles aus, aber nichts passiert. (Es erscheint noch nicht mal im Taskmanager)
'Modul:
Option Explicit
 
'API Deklarationen
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function CreateDesktop Lib "user32" Alias "CreateDesktopA" ( _
  ByVal lpszDesktop As Long, ByVal lpszDevice As Long, pDevmode As Any, ByVal _
  dwFlags As Long, ByVal dwDesiredAccess As Long, lpsa As Any) As Long
Private Declare Function SwitchDesktop Lib "user32" (ByVal hDesktop As Long) As _
Long
Private Declare Function GetThreadDesktop Lib "user32" (ByVal dwThread As Long) _
As Long
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Private Declare Function GetCurrentThread Lib "kernel32" () As Long
Private Declare Function OpenInputDesktop Lib "user32" (ByVal dwFlags As Long, _
  ByVal fInherit As Boolean, ByVal dwDesiredAccess As Long) As Long
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" ( _
ByVal lpApplicationName As String, ByVal lpCommandLine As String, _
lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal hInheritHandles As _
Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal _
lpCurrentDirectory As String, lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function CloseDesktop Lib "user32" (ByVal hDesktop As Long) As _
Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As _
Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As _
Long, ByVal dwMilliseconds As Long) As Long
'Hoffentlich nicht benötigt...
'Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle 
' As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
'Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias 
' "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As 
' String, lpLuid As LUID) As Long
'Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal 
' TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As 
' TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As 
' TOKEN_PRIVILEGES, ReturnLength As Long) As Long
 
'Konstanten
Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const HIGH_PRIORITY_CLASS = &H80&
Private Const INFINITE = -1&
Private Const STARTF_USESHOWWINDOW& = &H1
'Hoffentlich nicht benötigt:
Private Const DACL_SECURITY_INFORMATION = &H4
 
'Typen
Private Enum DESKTOP_ACCESS_MASK
DESKTOP_DELETE = &H10000
DESKTOP_WRITE_DAC = &H40000
DESKTOP_WRITE_OWNER = &H80000
DESKTOP_NONE = 0
DESKTOP_READOBJECTS = &H1
DESKTOP_CREATEWINDOW = &H2
DESKTOP_CREATEMENU = &H4
DESKTOP_HOOKCONTROL = &H8
DESKTOP_JOURNALEDRECORD = &H10
DESKTOP_JOURNALEDPLAYBACK = &H20
DESKTOP_ENUMERATE = &H40
DESKTOP_WRITEOBJECTS = &H80
DESKTOP_SWITCHDESKTOP = &H100
GENERIC_ALL = (DESKTOP_DELETE Or DESKTOP_WRITE_DAC Or DESKTOP_WRITE_OWNER Or _
  DESKTOP_READOBJECTS Or DESKTOP_CREATEWINDOW Or DESKTOP_CREATEMENU Or _
  DESKTOP_HOOKCONTROL Or DESKTOP_JOURNALEDRECORD Or DESKTOP_JOURNALEDPLAYBACK _
  Or DESKTOP_ENUMERATE Or DESKTOP_WRITEOBJECTS Or DESKTOP_SWITCHDESKTOP)
GENERIC_SPECIFIC = (DESKTOP_CREATEWINDOW Or DESKTOP_SWITCHDESKTOP)
End Enum
 
 
Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type
 
Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As Long
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
 
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
 
Private Enum enSW
SW_HIDE = 0
SW_NORMAL = 1
SW_MAXIMIZE = 3
SW_MINIMIZE = 6
End Enum
 
'Hoffentlich nicht benötig:
Private Type LUID
UsedPart As Long
IgnoredForNowHigh32BitPart As Long
End Type
 
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
TheLuid As LUID
Attributes As Long
End Type
 
'Variablen
Private D As Long 'DesktopHandle
Private oldDT As Long 'oldDesktopThreadHandle
Private oldDI As Long 'oldInputDesktopHandle
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VBA Access Desktoplocking Programm 
Autor: Zupa
Datum: 07.01.12 18:12

'Funktionen
Public Function LockDesktop()
'GrantPrivileges 'hoffentlich nicht benötigt
 
oldDT = GetThreadDesktop(GetCurrentThreadId())
oldDI = OpenInputDesktop(0, True, DESKTOP_SWITCHDESKTOP)
 
'neuer Desktop
D = CreateDesktop(StrPtr("MDeskKiosk"), ByVal 0&, ByVal 0&, 1, GENERIC_ALL, _
  ByVal 0&)
 
'Speichern, falls Neustart der Kompletten Anwendung nötig...
DoCmd.SetWarnings False
DoCmd.RunSQL "UPDATE Settings SET SettingValue='" & oldDI & "' WHERE" & _
  "SettingName='KioskModeDefDeskH';"
DoCmd.RunSQL "UPDATE Settings SET SettingValue='" & oldDT & "' WHERE" & _
"SettingName='KioskModeDefThreadH';"
DoCmd.RunSQL "UPDATE Settings SET SettingValue='" & D & "' WHERE" & _
"SettingName='KioskModeNewDeskH';"
DoCmd.RunSQL "UPDATE Settings SET SettingValue='1' WHERE" & _
"SettingName='KioskMode';"
DoCmd.SetWarnings True
 
 
Dim tSi As STARTUPINFO
Dim tPi As PROCESS_INFORMATION
Dim lR As Long
Dim lErr As Long
Dim sec1 As SECURITY_ATTRIBUTES
Dim sec2 As SECURITY_ATTRIBUTES
sec1.nLength = Len(sec1)
sec2.nLength = Len(sec2)
tSi.cb = Len(tSi)
tSi.lpDesktop = StrPtr("MDeskKiosk")
tSi.dwFlags = STARTF_USESHOWWINDOW 'STARTF_USETITLE 'STARTF_USEDESKTOP 'soweit 
' ich es verstehe, muss für Desktop und Title keine Flag gesetzt werden...
tSi.wShowWindow = SW_NORMAL
tSi.lpTitle = StrPtr("MDeskKiosk")
 
Dim sName As String
Dim rt As String
 
'*****************
'Diese beiden Methoden funktionieren nicht: (keine Fehlermeldung, es passiert 
' einfach  NICHTS)
'öffne Batchfile
 
sName = Replace(CreateKioskBatFile, "\", "\\", 1, -1, vbBinaryCompare)
rt = Replace(Environ("comspec") , "\", "\\", 1, -1, vbBinaryCompare)
'MsgBox rt & " " & sName
lR& = CreateProcess(rt & vbNullString, "/c " & sName & vbNullString, sec1, _
  sec2, False, &H80, 0&, vbNullString, tSi, tPi)
 
'ODER:
'öffne tmpDatabase
 
sName = Replace(Chr$(34) & tmpKioskDB & Chr$(34), "\", "\\", 1, -1, _
  vbBinaryCompare)
rt = Replace(Chr$(34) & AccessRoot & Chr$(34) , "\", "\\", 1, -1, _
vbBinaryCompare)' & " " & tmpKioskDB & vbNullString
'MsgBox rt & " " & sName
lR& = CreateProcess(vbNullString, rt & vbNullString & sName & vbNullString, _
  sec1, sec2, False, &H80&, 
0&, vbNullString, tSi, tPi)
'*****************
 
 
 
SwitchDesktop D
'Application.Quit 'Wohl eher nicht...
 
If lR = 0 Then
lErr = err.LastDllError
SwitchDesktop oldDI
CloseDesktop D
MsgBox lErr & "  ", , "last dllerror"
Else
'MsgBox "lR: " & lR & ", tPi.hProcess: " & tPi.hProcess & " " & 
' err.LastDllError, , "Success!!!"
'WaitForSingleObject tPi.hProcess, INFINITE 'erst wenn alles klar, sonnst _
  hängen wir uns auf...
CloseHandle tPi.hProcess
CloseHandle tPi.hThread
 
End If
End Function
 
'Hoffentlich nicht benötigt:
Public Function GrantPrivileges()
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
Dim hdlProcessHandle As Long
Dim hdlTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long
 
hdlProcessHandle = GetCurrentProcess()
OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), _
  hdlTokenHandle
LookupPrivilegeValue "", "SeDebugPrivilege", tmpLuid
tkp.PrivilegeCount = 1
tkp.TheLuid = tmpLuid
tkp.Attributes = SE_PRIVILEGE_ENABLED
AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), _
  tkpNewButIgnored, lBufferNeeded
End Function
 
Public Function UnLockDesktop() 'wird nach 5 sec von Form.Timer gerufen...
SwitchDesktop oldDI
End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VBA Access Desktoplocking Programm 
Autor: Zupa
Datum: 07.01.12 18:12

'Anderes Modul: 
Public Function CreateKioskBatFile(Optional EnterKiosk As Boolean = True) As _
  String
Dim path As String
path = CurrentProject.path
Dim fName As String
fName = CurrentProject.Name
 
Dim sRoot As String
sRoot = ""
#If Win64 Then
    If RegistryKeyExists(REG_SZ, HKEY_LOCAL_MACHINE, _
      "SOFTWARE\WOW6432Node\Microsoft\Office\" & SysCmd(acSysCmdAccessVer) & _
      "\Access\InstallRoot", "Path") Then sRoot = RegistryKeyValue(REG_SZ, _
      HKEY_LOCAL_MACHINE, "SOFTWARE\WOW6432Node\Microsoft\Office\" & SysCmd( _
      acSysCmdAccessVer) & "\Access\InstallRoot", "Path")
#Else
    If RegistryKeyExists(REG_SZ, HKEY_LOCAL_MACHINE, _
      "SOFTWARE\Microsoft\Office\" & SysCmd(acSysCmdAccessVer) & _
      "\Access\InstallRoot", "Path") Then sRoot = RegistryKeyValue(REG_SZ, _
      HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Office\" & SysCmd( _
      acSysCmdAccessVer) & "\Access\InstallRoot", "Path")
#End If
If sRoot = "" Then
    CreateKioskBatFile = False
    Exit Function
End If
 
Open path & "\" & fName & ".bat" For Output As #1
'Print #1, "@echo off & setlocal"
Print #1, "for /f " & Chr$(34) & "tokens=2 delims=:." & Chr$(34) & " %%i in (" & _
  "'chcp') do set " & Chr$(34) & "CP=%%i" & Chr$(34)
Print #1, "chcp 1252>nul"
Print #1, Chr$(34) & sRoot & "MSACCESS.EXE" & Chr$(34) & " " & Chr$(34) & path _
  & "\$" & fName & Chr$(34) '& "/x " & IIf(EnterKiosk, "enterKiosk", _
  "exitKiosk")
Print #1, "chcp %CP%>nul"
Print #1, "del " & Chr$(34) & path & "\" & fName & ".bat" & Chr$(34)
'Print #1, "pause"
Close #1
 
CreateKioskBatFile = Chr$(34) & path & "\" & fName & ".bat" & Chr$(34) 
End Function
 
Public Function tmpKioskDB() As String
tmpKioskDB = CurrentProject.path & "\$" & CurrentProject.Name
End Function
 
Public Function AccessRoot() As String
#If Win64 Then
    If RegistryKeyExists(REG_SZ, HKEY_LOCAL_MACHINE, _
      "SOFTWARE\WOW6432Node\Microsoft\Office\" & SysCmd(acSysCmdAccessVer) & _
      "\Access\InstallRoot", "Path") Then AccessRoot = RegistryKeyValue(REG_SZ, _
      HKEY_LOCAL_MACHINE, "SOFTWARE\WOW6432Node\Microsoft\Office\" & SysCmd( _
      acSysCmdAccessVer) & "\Access\InstallRoot", "Path") & "MSACCESS.EXE"
#Else
    If RegistryKeyExists(REG_SZ, HKEY_LOCAL_MACHINE, _
      "SOFTWARE\Microsoft\Office\" & SysCmd(acSysCmdAccessVer) & _
      "\Access\InstallRoot", "Path") Then AccessRoot = RegistryKeyValue(REG_SZ, _
      HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Office\" & SysCmd( _
      acSysCmdAccessVer) & "\Access\InstallRoot", "Path") & "MSACCESS.EXE"
#End If
End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VBA Access Desktoplocking Programm 
Autor: Franki
Datum: 08.01.12 20:22

Hallo,

Zitat:


Ich schreibe an einem Programm für Access, das ohne Logoff
oder Computerneustart in einen Kioskmodus versetzt werden
kann. (Zwar muss Eingabe erfolgen können, aber niemand soll
ohne entsprechendes Password auf Desktop, Dateien, Programme,
etc. zugreifen können)


Was genau meinst du damit?
Möchtest du dein Programm in den Kioskmodus versetzten oder den ganzen Rechner auf dem das Programm läuft?

Welche Eingabemöglichkeiten hat denn der User zur Verfügung? Kann er z.B. einfach den Stecker ziehen am Rechner, wieder rein stecken?

Zitat:


Meiner Vermutung nach ist ein globaler LL-Hook
(SetWindowsHookEx) zu einfach zu umgehen (vermutliche
Schwachstellen: Autostart, BalloonTipps, taskplaner oder
ähnliches). Wenn diese Vermutungen absolut unbegründet sein
sollten, unterrichtet mich bitte!


Beschreibe doch mal, was dein Programm überhaupt macht und wer da wie drauf Zugriff hat und mit welchen Rechten.

Denn...

Zitat:


Achso: Taskmanager, Abmeldefunktion, und ähnliche
Windows-Sicherheitsdienste können ja leicht in
der Registry ausgechaltet werden (Auch ohne Neustart!,
CTRL+ALT+DEL ist also umgangen).


... das scheint genau dein Problem zu sein.
Wenn der Rechner mit eingeschränkten Rechten gestartet wird, kann auch ohne dein Programm kein User etwas an der Registry verändern weil er da einfach keine Berechtigung zu hat. Das gilt schon seit NT4 wurde noch verfeinert durch UAC bei modernen Betriebssystemen. Dafür brauchst du keinen Kiok-Modus.

Also langer Rede kurzer Sinn, beschreibe doch mal was du überhaupt machen möchtest und warum. Vielleicht gibt es da bessere Möglichkeiten.

Dein Code ist ja "schwere Kost" und sehr umfangreich, ich glaube kaum, dass sich jemand den komplett durch liest geschweige denn da auf Fehlersuche geht. Zumal es sich um eine Access-Anwendung handelt. Das kann man mit VB / VB.NET und anderen Sprachen besser lösen und trotzdem auf Access Datenbanken zugreifen. Aber das ist ja nicht das Thema.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VBA Access Desktoplocking Programm 
Autor: Zupa
Datum: 09.01.12 17:37

Hallo Frank,

Vielen Dank für deine prompte Antwort.

Der Hintergrund: Meine Datenbank soll mal Seminarspiele/Ferienfreizeitspiele verwalten. Daraus folgt:
-nicht jeder Anwender ist versiert
-der Computer muss zeitweise auf die Benutzung des Programms beschränkt sein, bzw. Das Programm verhindert Zugriff auf Computer (Kiosk halt)
-während dieses Modus soll Eingabe zum Beispiel durch Textboxen möglich sein

Mein Programm soll ohne großen Aufwand von Benutzerseite (möglichst durch simplen Knopfdruck auf Button auf einem Formular) eine Oberfläche bieten, die, ohne das vorher hinterlegte Passwort eingegeben zu haben, den Zugriff auf den Computer verbietet, aber dennoch (Hintergrund-)Prozesse (wie kopieren/verschieben usw.) weiter durchführen lässt (sonst könnte man ja einfach desktop.exe beenden) und Eingabe zur Bearbeitung in der Datenbank erlaubt (Textfelder, ...).
Da mein Programm wahrscheinlich mehereren Menschen zur Verfügung stehen wird, kann ich nur hoffen, dass sie für den Fall eines Kaltstarts ein Benutzerpasswort für die Windows-Anmeldung eingerichtet haben... Mein Programm informiert nach einem Kaltstart über eine Login-Mitteilung (legalnotice), dass die Datenbank beim Öffnen wieder die ursprünglichen (Registry-)Einstellungen vornimmt.

Du schreibst auch davon, dass es mit VB/VB.Net einfachere Lösungen gibt. Wahrscheinlich habe ich davon schon viele gefunden, die mir vom Konzept her weitergeholfen haben. Es ist natürlich zu bedenken, ob sich eine solche Lösung auch aus Access (mit temporär erzeugten Modulen, o.ä.) steuern ließe. Kannst du mir einen Fingerzeig geben, da ich bisher nur auf Informationen gestoßen bin, nach denen es nicht möglich sei, externen Code zu starten?

Gerne kann ich auch Ausschnitte aus meinem Code präsentieren, wenn gewünscht. Hab aber gedacht, dass die kurzen Zusammenfassungen am Anfang der jeweiligen Blöcke schon einen konzeptionellen Überblick bieten und dennoch für Detailfragen der gesamte Code zur Verfügung steht. Tja, vertan, vertan...

Ich hoffe, dass mein Anliegen und meine Motivation klarer geworden sind.
Liebe Grüße,
Zupa
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VBA Access Desktoplocking Programm 
Autor: Franki
Datum: 10.01.12 00:05

Hallo,
Zitat:


Der Hintergrund: Meine Datenbank soll mal
Seminarspiele/Ferienfreizeitspiele verwalten. Daraus folgt:
-nicht jeder Anwender ist versiert


Das ist ja der Normalfall, dass Anwender weder Computerexperten, Programmierer usw. sind, also Laien normalerweise.

Zitat:


-der Computer muss zeitweise auf die Benutzung des Programms
beschränkt sein, bzw. Das Programm verhindert Zugriff auf
Computer (Kiosk halt)
-während dieses Modus soll Eingabe zum Beispiel durch
Textboxen möglich sein


Soweit so gut, aber wer soll den denn in diesen Zustand versetzten?

Zitat:


Mein Programm soll ohne großen Aufwand von Benutzerseite
(möglichst durch simplen Knopfdruck auf Button auf einem
Formular) eine Oberfläche bieten, die, ohne das vorher
hinterlegte Passwort eingegeben zu haben, den Zugriff auf den
Computer verbietet, aber dennoch (Hintergrund-)Prozesse (wie
kopieren/verschieben usw.) weiter durchführen lässt (sonst
könnte man ja einfach desktop.exe beenden)


Die nicht versierten Anwender wissen wie man Destkop.exe beendet?
So ganz unwissend können die ja wohl doch nicht sein, wenn da das befürchtest.
Ich weiß immer noch nicht wer die Zielgruppe deiner Anwender eigentlich ist.

Zitat:


Da mein Programm wahrscheinlich mehereren Menschen zur
Verfügung stehen wird, kann ich nur hoffen, dass sie für den
Fall eines Kaltstarts ein Benutzerpasswort für die
Windows-Anmeldung eingerichtet haben... Mein Programm
informiert nach einem Kaltstart über eine Login-Mitteilung
(legalnotice), dass die Datenbank beim Öffnen wieder die
ursprünglichen (Registry-)Einstellungen vornimmt.


Hier auch wieder die Frage, wer überhaupt einen Kaltstart durchführen kann und mit welchem Passwort er dann welche Rechte hat.

Zitat:


Du schreibst auch davon, dass es mit VB/VB.Net einfachere
Lösungen gibt. Wahrscheinlich habe ich davon schon viele
gefunden, die mir vom Konzept her weitergeholfen haben. Es
ist natürlich zu bedenken, ob sich eine solche Lösung auch
aus Access (mit temporär erzeugten Modulen, o.ä.) steuern
ließe. Kannst du mir einen Fingerzeig geben, da ich bisher
nur auf Informationen gestoßen bin, nach denen es nicht
möglich sei, externen Code zu starten?


Na ja, es ist aber aus Access heraus definitiv möglich eine andere EXE Datei zu starten. Code innerhalb von Access aus einer solchen auszuführen geht eher nicht. Diese EXE könnte dann ja auch auf die DB (mdb. z.B.) zugreifen sowohl lesend als auch schreibend.

Aber unabhängig davon das Problem unversierter Anwender ist doch eher, dass die in den ihnen zur Verfügung stehenden Möglichkeiten irgendwelchen Quatsch eingeben, das hat erste Priorität bei der Kontrolle der Eingaben.

Mir scheint das so, dass du da irgendwie verhindern möchtest, dass irgendwelche Jugendliche nicht wirklich mit deinem Programm arbeiten wollen sondern einfach nur den Rechner hacken wollen. Das ist aber ein ganz anderes Thema dem man nicht aus einer Access Anwendung heraus vorbeugen kann.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VBA Access Desktoplocking Programm 
Autor: Zupa
Datum: 10.01.12 17:04

Hallo Frank,

Entschuldige bitte, dass ich mich so missverständlich ausdrücke.

Sämtliche Implikationen von "der Anwender ist Laie" stellen sich für mich wie folgt und in diesem Satz dar: Alles, was zum Erreichen des gewünschten Zustandes zu leisten ist, muss das Programm übernehmen.

(Mit "explorer.exe beenden" meinte ich, das Programm beendet den Explorer (über WMI). Diesen Gendanken habe ich aber wieder verworfen. Grund: Möglichkeiten, ein Programm zu beenden, ein neues zu starten oder zwischen ihnen zu wechseln, die explorer.exe zur Verfügung stellt, wären zwar damit ausgeschaltet, jedoch beendet dies auch nützliche "Hintergrund"aktionen, wie Kopieren o.ä., die kurz vor dem Aktivieren des Kioskmodus vom Benutzer gestarten worden sein könnten und unbedingt ungestört weiterlaufen sollen.)

Der Anwender klickt auf eine Schaltfläche mit der Beschriftung "Kioskmodus starten" (o.ä.), schon geht's los und er oder sie muss sich keine Gedanken machen, dass jemand "einfach so" auf den Computer zugreifen kann. Durchaus bin ich mir bewusst, dass es höchstwahrscheinlich keinen Weg gibt, einen Computer inklusive Daten gleichzeitig existent und sicher zu halten. Wer es also darauf anlegt, kann selbstverständlich JEDEN (physikalischen und programmierten) Schutz umgehen, den sich andere Menschen ausdenken. Mein Programm soll lediglich verhindern, dass "mal eben so" auf persönliche Mails o.ä. zu gegriffen werden kann. Deshalb akzeptiere ich, dass ein Kaltstart von meiner Seite nicht zu verhindern ist, dass nur hoffentlich vorher für die Benutzeranmeldung ein sicheres Passwort eingerichtet wurde, dass jemand ein Bootfähiges Volume anschließt und sich Zugriff verschaffen kann. (Oder andere Maßnahmen, die Zeit und Überwindung kosten und vorraussetzen, dass jemand tatsächlich ein gewisses mindestmaß an krimineller Energie und Wissen mitbringt)

Vielen Dank für deine Gedanken zum Hintergrund der Benutzung also, aber selbstverständlich werde ich die Benutzer meines Programms über das (hoffentlich kleine) Restrisiko aufklären.

Danke auch, dass du mein Augenmerk darauf richtest, dass in besagtem Modus ein Formular zur Texteingabe geöffnet sein wird, die von der DB (intern) bearbeitet und aber vorher geprüft werden muss. Diese (dann hoffentlich einzig mögliche) Eingabe zu kontrollieren wird jedoch nicht mehr dieses Thema berühren.

Kurz noch zu den Anwendern. Es wird zwei Sorten geben: die einen (Moderatoren, Gruppenleiter) lassen das Programm auf ihrem PC laufen und möchten, dass die anderen (Teilnehmende) dort brav nur in das Programm Eingaben machen und dass das Zugreifen auf ihre(n) Computer/Dateien/Programme/Emails etc. verhindert wird. Eine moderne Möglichkeit, Seminar-/Freizeitbegleitende Spiele durchzuführen.

Ich möchte kurz zusammenfassen, was meine bisher erprobten Strategien sind:

1) -Eine Batchdatei wird erstellt und auf dem neu erstellten Desktop ausgeführt. (CreateProcess Api)
-Diese soll entweder die gegenwärtige DB beenden und wieder (auf dem neuen Desktop) öffnen oder eine temporäre DB auf dem neuen Desktop öffnen.

2) -Mit CreateProcess wird direkt eine temporäre Datenbank auf dem neuen Desktop geöffnet.

3) -Ein Thread (CreateThread Api) innerhalb von Access wird mit SetThreadDesktop auf den neuen Desktop
geschoben, der dort entweder ein Formular öffnet, oder ein schon geöffnetes dorthin verschiebt.

Diese drei Methoden werfen keinen Fehler auf sondern tun stattdessen einfach lieber gar nichts.

Ich hoffe, ich verstehe es richtig, dass es keine Funktion zum erstellen eines Fensters auf einem anderen Desktop gibt. Ich hoffe auch, dass es nicht nötig ist, den ProcessToken meiner DB zu manipulieren.



Liebe Grüße,

Zupa
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel