Página 1 de 1

Bloquear a Estação de Usuário

Enviado: 27 Mar 2014 21:04
por asimoes
A minha contribuição de hoje é fazer com que a aplicação bloquei a estação de trabalho do usuário caso ele deixe a máquina desprotegida por ter ido tomar um café, ter ido ao banheiro ou estar voando mesmo, só que ele deixou o seu desktop desprotegido e alguém pode acessar suas informações sem o seu conhecimento e gerar problemas.
É muito simples o exemplo:

Este exemplo eu usei a hwgui, mas pode ser adaptado perfeitamente para o harbour console.

Código: Selecionar todos

*********************************************************************
* Programa : Bloqueio                                                *
* Autor    : Alexandre Simões                                       *
* Data     : 27/03/2014                                             *
* Descricao: Proteger o desktop do usuário                             *
*********************************************************************
#include "hbcompat.ch"
#include "common.ch"
#include "set.ch"
#include "hwgui.ch"

STATIC nSeconds

FUNCTION Main
LOCAL oIconApp:=HIcon():AddResource("ICON_1")
LOCAL addX:=20, nWidth:=640, nHeight:=500, addY:=20
PRIVATE oDialogWindow, oLabel, oTimer, lFecharWindow:=.F.
PRIVATE aMensagens:={Space(10)+'Banner (letreiro)'+Space(10),' Letreiro com HwGui',' Banner com HwGui'}, nTam:=15 //9 //20

   PREPARE FONT oFont NAME "Tahoma" WIDTH nTam HEIGHT -26 //-13

   addY += 30

   hDC := hwg_Getdc( hwg_Getactivewindow() )
   hwg_SelectObject( hDC, oFont:handle )
   aMetr := hwg_GetTextMetric( hDC )
   aArea := hwg_GetDeviceArea( hDC )
   aRect := hwg_GetWindowRect( hwg_GetActiveWindow() )
   hwg_Releasedc( hwg_Getactivewindow(), hDC )

   cCaption:=aMensagens[1]
   
   nLen:=Len(cCaption)

   nLenArray:=4
   
   nHeight := ( aMetr[ 1 ] + 1 ) * 1 + nLenArray + addY + nLenArray

   nWidth := (nLen * aMetr[ 2 ]) + 25 + 250
   
   INIT DIALOG oDialogWindow ;
        TITLE   "Banner" ;
        ICON    oIconApp ;
        AT      0,0 ;
        SIZE    nWidth + 20, nHeight ;
        FONT    oFont ;
        COLOR   16760439 ;
        STYLE   DS_CENTER + WS_VISIBLE + WS_SYSMENU

   @ 0,0 SAY oLabel CAPTION "Bloqueando a estação em 30 segundo(s) - 99:99:99";
                    FONT oFont ;
                    STYLE SS_CENTER + WS_BORDER ;
                    COLOR hwg_RGB(0,0,255) BACKCOLOR 16777172

   nAltura :=40 //40
   nPosicao:=80 //63
   
   oLabel:bSize := { | o, x, y | hwg_MoveWindow( o:handle, addX / 2, nHeight - nPosicao, x - addX  , nAltura ) }

   Liga_Timer(oDialogWindow,.T.)
   
   oDialogWindow:Center()
   
   oDialogWindow:Activate() // Parâmetro .T. = NOMODAL, .F. ou () = MODAL

RETURN Nil

FUNCTION Liga_Timer(oJanela,lLiga)
MEMVAR oTimer
   IF lLiga
      SET TIMER oTimerTempo of oJanela VALUE 1000 ACTION {|| MensTime(30)}
   ELSE
      oJanela:oTimer:End()   
   ENDIF
RETURN Nil

FUNCTION MensTime(nTime)
   IF nSeconds = Nil
      nSeconds:=Seconds()
   ENDIF
   IF Seconds() - nSeconds >= nTime
      BloquearEstacao("%windir%\System32\rundll32.exe user32.dll,LockWorkStation",.F.)
      nSeconds:=Seconds()
   ELSE
      oLabel:caption:="Bloqueando a estação em "+StrZero(nTime,2)+" segundo(s) - "+SecToTime(Seconds()-nSeconds)
   ENDIF
   hwg_doevents()
RETURN Nil

FUNCTION BloquearEstacao(cComando,lEspera)
LOCAL oShell, lOk:=.T.
DEFAULT lEspera TO .T.
   TRY
      oShell:=WIN_OleCreateObject( "WScript.Shell" )
   CATCH
      TRY
         oShell:=WIN_OleCreateObject( "WScript.Shell" )
      CATCH
         lOk:=.F.
      END
   END
   IF lOk
      TRY
        oShell:Run( "%comspec% /c " + cComando, 0, lEspera )
      CATCH
         lOk:=.F.
      END
      oShell:=Nil
   ENDIF
RETURN lOk

Bloquear a Estação de Usuário

Enviado: 27 Mar 2014 21:38
por asimoes
Pode bloquear também desta forma:

ShellExecute(0, "open", "rundll32.exe", "user32.dll,LockWorkStation", , 1)

Código: Selecionar todos

#pragma BEGINDUMP
#include <windows.h>

#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapifs.h"

#include <shellapi.h>
#include <shlobj.h>
#include <shlwapi.h>

#include <lmcons.h>
#include <commctrl.h>

HB_FUNC( SHELLEXECUTE )
{
   hb_retnl
   (
      ( LONG ) ShellExecute
      (
         ( HWND ) hb_parnl( 1 ),
         HB_ISNIL( 2 ) ? NULL : ( LPCTSTR ) hb_parc( 2 ),
         ( LPCSTR ) hb_parc( 3 ),
         HB_ISNIL( 4 ) ? NULL : ( LPCTSTR ) hb_parc( 4 ),
         HB_ISNIL( 5 ) ? NULL : ( LPCTSTR ) hb_parc( 5 ),
         hb_parni( 6 )
      )
   );
}
#pragma ENDDUMP

Bloquear a Estação de Usuário

Enviado: 28 Mar 2014 06:54
por lugab
Legal,

Será q alguém tem algo similar pra gente colocar no nosso harbour/xharbour ?

Naturalmente, eu não faço idéia de como adaptar

Bloquear a Estação de Usuário

Enviado: 28 Mar 2014 08:19
por asimoes
O exemplo em harbour. (=== modificado ===)

Código: Selecionar todos

#include "inkey.ch"
#include "setcurs.ch"
#include "error.ch"
#include "achoice.ch"
#include "fileio.ch"
#include "common.ch"
#include "dbinfo.ch"
#include "hbver.ch"
#include "hbdyn.ch"
#include "wvtwin.ch"
#include "hbgtinfo.ch"
#include "hbgtwvg.ch"
#include "wvgparts.ch"
#include "hbcompat.ch"
#include "hbhrb.ch"
#include "directry.ch"
#include "hbwin.ch"
#include "hbthread.ch"

STATIC nSeconds
STATIC nTempoUltimaVerificacao
STATIC nIdleTime

FUNCTION MAIN()
LOCAL cTeste:=Space(5)

PUBLIC __nTeclaDigitada:=Inkey()
   
   IniciaTempo()
   
   @ 01,00 SAY PADC("TESTE DE BLOQUEIO DE ESTAۂO",80) COLOR "W+/B*"
      
   SET CURSOR ON
   @ 05,00 SAY "TESTE : " GET cTeste COLOR "W/N"
   READ

RETURN NIL

FUNCTION MensTime(nTime)
   DO WHILE .T.
      IF nSeconds = Nil
         nSeconds:=Seconds()
      ENDIF
      IF __nTeclaDigitada <> 0
         nSeconds:=Seconds()
      ENDIF
      IF Seconds() - nSeconds >= nTime 
         //BloquearEstacao("%windir%\System32\rundll32.exe user32.dll,LockWorkStation",.F.)
         ShellExecute(0, "open", "rundll32.exe", "user32.dll,LockWorkStation", , 1)
         nSeconds:=Seconds()
      ENDIF
   ENDDO
RETURN Nil

FUNCTION IniciaTempo
   IF nIdleTime != Nil
      HB_IdleDel( nIdleTime )
   ENDIF
   hb_threadStart(HB_THREAD_INHERIT_PUBLIC,@MensTime(),30)
   nIdleTime:=HB_IdleAdd( {|| ViewTime(30) } )
RETURN .T.  

FUNCTION ViewTime(nTempo)
LOCAL nRow, nCol 

   __nTeclaDigitada:=Inkey()
   
   nRow:=Row()
   nCol:=Col()
   IF nTempoUltimaVerificacao = Nil .OR. __nTeclaDigitada <> 0
      nTempoUltimaVerificacao:=Seconds()
      KEYBOARD Chr(__nTeclaDigitada)
   ENDIF
   IF Seconds() - nTempoUltimaVerificacao >= nTempo 
      nTempoUltimaVerificacao:=Seconds()
   ELSE
      @ 23,00 SAY PADC("Bloqueando a esta‡Æo em "+StrZero(nTempo,2)+" segundo(s) - "+SecToTime(Seconds()-nTempoUltimaVerificacao),80) COLOR "W+/B"
      SetPos(nRow,nCol)
   ENDIF
RETURN Nil

FUNCTION BloquearEstacao(cComando,lEspera)
LOCAL oShell, lOk:=.T.
DEFAULT lEspera TO .T.
   TRY
      oShell:=WIN_OleCreateObject( "WScript.Shell" )
   CATCH
      TRY
         oShell:=WIN_OleCreateObject( "WScript.Shell" )
      CATCH
         lOk:=.F.
      END
   END
   IF lOk
      TRY
        oShell:Run( "%comspec% /c " + cComando, 0, lEspera )
      CATCH
         lOk:=.F.
      END
      oShell:=Nil
   ENDIF
RETURN lOk

INIT FUNCTION AppSetup()
  
  REQUEST HB_LANG_PT
  REQUEST HB_CODEPAGE_PT850
  HB_LANGSELECT("PT")
  HB_CDPSELECT( "PT850" ) //pt850

  SETMODE(24,80)

  SET TYPEAHEAD TO 0
  SET INTENSITY ON
  SET SCOREBOARD OFF
  SET DELETED ON
  SET SAFETY OFF
  SET DATE ANSI
  SET ESCAPE ON
  SET DELIMITERS TO
  SET EXCLUSIVE OFF
  SET WRAP ON
  SET EPOCH TO 1920
  SET MESSAGE TO 24 CENTER

  SetColor("W+/B")
  
  CLS

  SetColor("W+/B")
  
  IniciaJanela()


RETURN Nil 


FUNCTION IniciaJanela(nLi,nCi,nLf,nCf)

LOCAL oCrt
   HB_Default(@nLi,0)
   HB_Default(@nCi,0)
   HB_Default(@nLf,MaxRow())
   HB_Default(@nCf,MaxCol())
  
  cTituloJanela:="Teste de Bloqueio de Esta‡Æo"

  #ifndef HARBOUR_MSVC
     oCrt:=WvgCrt():New( , , { nLi, nCi }, { nLf, nCf }, , .T. )
     oCrt:create()
     oCrt:resizable:=.F.
  #endif

   HB_gtInfo(HB_GTI_FONTNAME, "Lucida Console")
   HB_gtInfo(HB_GTI_WINTITLE, cTituloJanela)
   HB_gtInfo(HB_GTI_CLOSABLE, .F. )
   HB_gtInfo(HB_GTI_ISGRAPHIC, .T. )
   HB_gtInfo(HB_GTI_STDERRCON, .T. )
   HB_gtInfo(HB_GTI_COMPATBUFFER, .T. ) 
   HB_gtInfo(HB_GTI_SPEC, HB_GTS_WNDSTATE, HB_GTS_WS_MAXIMIZED )
   HB_gtInfo(HB_GTI_SPEC, HB_GTS_SHOWWINDOW, SW_NORMAL )
   
RETURN Nil

FUNCTION HB_GTSYS()
   REQUEST HB_GT_WVG_DEFAULT
   REQUEST HB_GT_WVT
   REQUEST HB_GT_WGU
   REQUEST HB_GT_WVG
RETURN Nil 

#pragma BEGINDUMP
#include <windows.h>

#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapifs.h"

#include <shellapi.h>
#include <shlobj.h>
#include <shlwapi.h>

#include <lmcons.h>
#include <commctrl.h>

HB_FUNC( SHELLEXECUTE )
{
   hb_retnl
   (
      ( LONG ) ShellExecute
      (
         ( HWND ) hb_parnl( 1 ),
         HB_ISNIL( 2 ) ? NULL : ( LPCTSTR ) hb_parc( 2 ),
         ( LPCSTR ) hb_parc( 3 ),
         HB_ISNIL( 4 ) ? NULL : ( LPCTSTR ) hb_parc( 4 ),
         HB_ISNIL( 5 ) ? NULL : ( LPCTSTR ) hb_parc( 5 ),
         hb_parni( 6 )
      )
   );
}
#pragma ENDDUMP

Bloquear a Estação de Usuário

Enviado: 28 Mar 2014 12:38
por lugab
Obrigado, Asimoes

Bloquear a Estação de Usuário

Enviado: 28 Mar 2014 14:02
por alxsts
Olá!

Obrigado por compartilhar.

Quais libs são necessárias para linkar?

Código: Selecionar todos

D:\TestesHB\LockComputer>hbmk2 lock -b
Harbour 3.2.0dev (Rev. 18443)
Copyright (c) 1999-2012, http://harbour-project.org/
Compiling 'lock.prg'...
Lines 6342, Functions/Procedures 8
Generating C source output to 'C:\Users\santosa\AppData\Local\Temp\hbmk_zui4r7.dir\lock.c'... Done.
C:/Users/santosa/AppData/Local/Temp/hbmk_zui4r7.dir/lock.o:lock.c:(.data+0x1f8): undefined reference
 to `HB_FUN_SECTOTIME'
C:/Users/santosa/AppData/Local/Temp/hbmk_zui4r7.dir/lock.o:lock.c:(.data+0x228): undefined reference
 to `HB_FUN_WIN_OLECREATEOBJECT'
C:/Users/santosa/AppData/Local/Temp/hbmk_zui4r7.dir/lock.o:lock.c:(.data+0x328): undefined reference
 to `HB_FUN_WVGCRT'
C:/Users/santosa/AppData/Local/Temp/hbmk_zui4r7.dir/lock.o:lock.c:(.data+0x398): undefined reference
 to `HB_FUN_HB_GT_WVG_DEFAULT'
C:/Users/santosa/AppData/Local/Temp/hbmk_zui4r7.dir/lock.o:lock.c:(.data+0x3b8): undefined reference
 to `HB_FUN_HB_GT_WGU'
C:/Users/santosa/AppData/Local/Temp/hbmk_zui4r7.dir/lock.o:lock.c:(.data+0x3c8): undefined reference
 to `HB_FUN_HB_GT_WVG'
collect2: ld returned 1 exit status
hbmk2: Erro: Executando linkeditor. 1
gcc.exe C:/Users/santosa/AppData/Local/Temp/hbmk_zui4r7.dir/lock.o C:/Users/santosa/AppData/Local/Te
mp/hbmk_zui4r7.dir/hbmk_a6mqaw.o    -mconsole -Wl,--start-group -lhbextern -lhbdebug -lhbvm -lhbrtl
-lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lr
ddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbma
instd -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -lu
uid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib   -Wl,--
end-group -olock.exe  -LD:/hmg.3.0.46/HARBOUR/lib/win/mingw

D:\TestesHB\LockComputer>

Bloquear a Estação de Usuário

Enviado: 28 Mar 2014 22:36
por asimoes
Para compilar:

Bat para compilar.

Código: Selecionar todos

@echo off
set path=\hb32\bin
hbmk2 bloqueio.hbp -rebuild
pause
script hbp para compilar

Código: Selecionar todos

#---------------------------
# Nome do Executavel
# ---------------------------
-obloqueio
# ---------------------------
# Bibliotecas
# ---------------------------
-lhbct
-lhbgt
-lgtwvg
-lgtwvt
-lhbwin
-lhbnf
-lxhb
# ---------------------------
# Caminhos dos Includes
# ---------------------------
-incpath=\hb32\include;
# ---------------------------
# Caminho das Libs da HwGui
# ---------------------------
# Outros Parƒmetros
# ---------------------------
-workdir=.\OBJMINGW\
-gtgui
-head=full
-n
-warn=no
-inc
#Para compactar o executável.
#-compr 
-b
-mt
-dVERSAO_MINGW
# ---------------------------
# Prg(s) e Rc(s)
# ---------------------------
bloqueio.prg

Bloquear a Estação de Usuário

Enviado: 29 Mar 2014 08:02
por asimoes
Um shell só para o RUNDLL32

Uso: rundll32Shell("user32.dll,LockWorkStation",.F.) //.T. aguarda a resposta da execução.

Código: Selecionar todos

#pragma BEGINDUMP
#include <windows.h>

#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapifs.h"

#include <shellapi.h>
#include <shlobj.h>
#include <shlwapi.h>

#include <lmcons.h>
#include <commctrl.h>

   HB_FUNC( RUNDLL32SHELL )
   {
     SHELLEXECUTEINFO ShExecInfo = {0};     
     
     LPCTSTR lpCommand = (LPTSTR) hb_parc( 1 );
     
     BOOL bRetorno = FALSE;
     
     int lenlpCommand = hb_parclen( 1 ) + 4;
     
     char * cfinalCommand = ( char * ) hb_xgrab( hb_parclen( 1 ) + 4 );
     
     hb_snprintf(cfinalCommand, lenlpCommand, "%s%s", "/C ", lpCommand);
    
     ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
     ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
     ShExecInfo.hwnd = NULL;
     ShExecInfo.lpVerb = NULL;
     ShExecInfo.lpFile = "rundll32.exe";
     ShExecInfo.lpParameters = cfinalCommand;   
     ShExecInfo.lpDirectory = NULL;
     ShExecInfo.nShow = SW_HIDE;
     ShExecInfo.hInstApp = NULL; 
     ShellExecuteEx(&ShExecInfo);
     if(ShExecInfo.hProcess !=NULL)
     {
        if (hb_parl(2))
        {
           //Aguarda até que a execução tenha sido concluída.
           WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
           CloseHandle(ShExecInfo.hProcess);
        }
        bRetorno = TRUE;
     }
     else
     {
        //Retorna .F.
        bRetorno = FALSE;
     }
     hb_xfree( cfinalCommand );
     hb_retl(bRetorno);
   }
#pragma ENDDUMP

Bloquear a Estação de Usuário

Enviado: 29 Mar 2014 09:38
por asimoes
Completando com mais uma função interessante:

ExitWindowsEx(0,0) //logoff
ExitWindowsEx(1,0) //shutdown
ExitWindowsEx(2,0) //reboot (reinicilializar)
ExitWindowsEx(6,0) //force reboot (reinicialização forçada)
ExitWindowsEx(8,0) //poweroff (desligar)

Código: Selecionar todos

IF hb_osIsWinNT()
   EnablePermissions()
ENDIF
ExitWindowsEx(6,0) //force reboot 2 + 4 (reinicialização forçada)

#pragma BEGINDUMP
#include <windows.h>

#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapifs.h"

#include <shellapi.h>
#include <shlobj.h>
#include <shlwapi.h>

#include <lmcons.h>
#include <commctrl.h>

HB_FUNC( ENABLEPERMISSIONS )
{
   LUID tmpLuid;
   TOKEN_PRIVILEGES tkp, tkpNewButIgnored;
   DWORD lBufferNeeded;
   HANDLE hdlTokenHandle;
   HANDLE hdlProcessHandle = GetCurrentProcess();

   OpenProcessToken(hdlProcessHandle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hdlTokenHandle);

   LookupPrivilegeValue(NULL, "SeShutdownPrivilege", &tmpLuid);

   tkp.PrivilegeCount            = 1;
   tkp.Privileges[0].Luid        = tmpLuid;
   tkp.Privileges[0].Attributes  = SE_PRIVILEGE_ENABLED;

   AdjustTokenPrivileges(hdlTokenHandle, FALSE, &tkp, sizeof(tkpNewButIgnored), &tkpNewButIgnored, &lBufferNeeded);
}

HB_FUNC( EXITWINDOWSEX )
{
   hb_retl( ExitWindowsEx( (UINT) hb_parni( 1 ), (DWORD) hb_parnl( 2 ) ) );
}

#pragma ENDDUMP


Bloquear a Estação de Usuário

Enviado: 29 Mar 2014 17:53
por asimoes
Simplesmente:

Código: Selecionar todos

FUNCTION MAIN
   LockWorkStation()
RETURN Nil

Código: Selecionar todos

#pragma BEGINDUMP
#include <windows.h>

HB_FUNC( LOCKWORKSTATION )
{
	  WINUSERAPI
	  BOOL
	  WINAPI LockWorkStation(VOID);
     LockWorkStation();
}
#pragma ENDDUMP