Freigeben über


SendSas Step by Step

Eccoci alla seconda puntata che spiega come implementare correttamente la SendSAS, la funzione che serve ad inviare la Secure Attention Sequence al sistema, cioè ad inviare CTRL+ALT+CANC.

L’altra volta abbiamo visto che la dichiarazione della funzione in VB.Net si riduce a questa linea:

 Public Declare Sub SendSAS Lib "SAS.DLL" (ByVal fAsUser As Boolean)

Vediamo ora di creare quindi un nuovo progetto VS 2008 e di implementare la SendSAS.

Creiamo un nuovo progetto VB.Net e sulla Form1 creata di default posizioniamo un nuovo pulsante, Button1.

Facciamo doppio click sul pulsante e inseriamo questo codice:

 Imports System.Runtime.InteropServices 
Public Class Form1 
    Public Declare Sub SendSAS Lib "SAS.DLL" (ByVal fAsUser As Boolean) 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
        SendSAS(True) 
    End Sub 
End Class

Il nostro programma di esempio è finito.

Adesso dobbiamo realizzare tutte le azioni di contorno che abbiamo visto nel post precedente. Prendiamo come sistema operativo di esempio Windows 7.

  1. Dobbiamo settare il flag uiAccess a true nel manifest dell’applicazione
  2. Dobbiamo firmare digitalmente il file eseguibile generato
  3. Dobbiamo abilitare la policy
  4. Dobbiamo posizionare il programma in uno degli store “sicuri” / “trusted”

1 Modificare il manifest

Right click sul progetto nell’IDE di Visual Studio, Properties, nel Tab Application, premere il pulsante “View UAC Settings” VSUAC

e modificare come segue:

<requestedExecutionLevel level="asInvoker" uiAccess="true" />UIAccesstrue

2 Firmare digitalmente il file

Il punto 2 è chiaramente il più complicato.

In questo esempio, creeremo un certificato digitale di test del tipo “self-signed”. Nel mondo reale, dovrete procurarvi un certificato da una Certification Authority, tipo Verisign, valido per la firma digitale dei programmi.

Serve il Platform SDK installato.
L’ultimo Platform SDK è scaricabile da qui: http://www.microsoft.com/downloads/details.aspx?familyid=C17BA869-9671-4330-A63E-1FD44E0E2505&displaylang=en

Dopo l’installazione dell’SDK, apriamo la ‘Command Shell’ del ‘Microsoft Windows SDK v7.0’, ‘As Administrator’, e creiamo un certificato personale destinato al MY store con questo comando:

makecert -r -pe -n "CN=Test Certificate - For SendSAS Use Only" -ss MY c:\temp\testcert.cermakecert

Quindi aggiungiamo il certificato allo store di root in modo che il certificato stesso sia trustato.

certmgr.exe -add c:\temp\testcert.cer -s -r localMachine rootcertmgr

E finalmente firmiamo il nostro programma digitalmente.

SignTool sign /v /s MY /n "Test Certificate - For SendSAS Use Only" /t http://timestamp.verisign.com/scripts/timestamp.dll "C:\Users\mariora.EUROPE\Documents\Visual Studio 2008\Projects\SendSAS\SendSAS\bin\Release\SendSAS.exe"
signtool

Dato che per generare il timestamp si usa un servizio pubblico disponibile su Internet, fornito dalla Verisign direttamente, occorre avere una connessione ad Internet attiva e che il server della Verisign sia disponibile. Durante i test che ho fatto, talvolta il server non era raggiungibile e ottenevo degli errori di timeout. Si può solo riprovare..

3 Abilitare la policy

Usando GPEDIT o il Registry Editor (RegEdit), creiamo la policy necessaria ad abilitare la Software SAS. Eseguite gpedit.msc.

Navighiamo l’albero alla sinistra: Computer Configuration, Administrative Templates, Windows Components, Window Logon Options. Qui troviamo tre policies, tra cui “Disable or Enable software Secure Attention Sequence”.

La abilitiamo e scegliamo tra le opzioni “Service and Ease of Access applications”:

gpedit

Verificate che alla fine sia stata generata la chiave SoftwareSASGeneration sotto

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

policy

SoftwareSASGeneration è una DWORD e se impostata a “Both” vale 3.

Durante i test ho avuto qualche problema con questo passo, nel senso che la policy mi veniva salvata in un profile temporaneo sotto la chiave utente e chiaramente poi quando si eseguiva il programma, non funzionava. Ho dovuto creare la policy a mano col Regedit. Poco male..

Potete anche evitare gpedit.msc se siete abbastanza in buoni rapporti con il RegEdit, creando direttamente la chiave.

4 Copiare il file in una cartella protetta

Non rimane che copiare li file in una location protetta. Creiamo un nuovo folder sotto “C:\Programmi”, chiamiamolo SendSas ad esempio e copiamoci l’eseguibile precedentemente firmato digitalmente.

Folder

Siccome il folder C:\Programmi è una locazione protetta, solo Administrators e Trusted Installer possono copiare in quel foder direttamente. Per cui su Vista e Windows 7 sono necessari i privilegi di Administrator.

Fatto quest’ultimo passo, possiamo provare ad avviare il nostro programma che premendo il pulsante sulla form farà apparire il desktop di Logon esattamente come quando si preme CTRL+ALT+CANC.

Spero di essere stato chiaro ed esauriente!

Alla prossima!

-mario

Mario Raccagni
Senior Support Engineer
Platform Development Support Team

Comments

  • Anonymous
    September 20, 2009
    Ciao Mario, ho trovato molto interessante questo articolo. Conservavo gelosamente i tuoi 'famosi link' su VB6, e credo proprio che farò lo stesso con questo tuo 'blog' Ciao e grazie! :-D gibra

  • Anonymous
    September 20, 2009
    Ciao Giorgio! Grazie.. Ho tante cose da condividere, ce ne saranno altri molto interessanti spero.. certo, magari tu queste cose le saprai già, ma per altri saranno utili:-) Ciao -mario

  • Anonymous
    September 21, 2009
    La firma di un file eseguibile con certificato “self-signed” in cosa differisce rispetto a un certificato procurato da Verisign? I nostri utenti cosa vedranno di diverso? Si può usare il "self-signed" come test? By the way, ottimo blog Mario e... bentornato tra noi!!!

  • Anonymous
    September 21, 2009
    Ciao Sergio! La differenza fondamentale sta nel fatto che, se non installi lo stesso certificato nella Trusted Root, appare come valido, ma proveniente da una entità sconosciuta e per tanto ritenuto inaffidabile. Se lo guardi nell'interfaccia, appare con il classico simbolo della X rossa accanto alla coccarda, perchè non c'è un certificato valido della root CA che lo ha generato. I certificati commerciali, invece, hanno il certificato pubblico della CA già installato nel sistema operativo e quindi appaiono come validi a tutti gli effetti da subito. Puoi vedere tu stesso la differenza se al punto due salti lo step del certmgr. Senza quello il certificato non sarà trustato, e già guardando tra le proprietà del file la firma digitale vedrai la X rossa che segnala problemi. In più se provi ad avviare l'exe ti ritorna un errore di "referral", perchè non si riesce a trovare la root del certificato usato per firmare l'exe. Ciao! A presto! -mario

  • Anonymous
    November 18, 2009
    Ciao Mario, I have a question. How should I do at "SoftwareSASGeneration=0"?

  • Anonymous
    November 18, 2009
    The comment has been removed

  • Anonymous
    November 19, 2009
    I couldnt send SAS when UAC was off. Even I changed EnableLUA to 1, UAC is still on until the system reboots. How can I do if EnableLUA is 0 ?

  • Anonymous
    November 19, 2009
    UAC must be turned on for this to work, as access to the secure desktop is required, and the whole infrastructure is based on UAC.. The fact that the manifest must contain UIAccess=True, that the policy SoftwareSASGeneration must be in place, that the executable must be digitally signed and placed ina protect location are all elements related to UAC.. EnableLUA effectively enable and disable UAC, but a reboot is absolutely required.. there are too many difference when UAC is enabled or disabled to be changed and become effective "on the fly".. HTH -mario

  • Anonymous
    December 14, 2009
    Thanks maiora. I'll try another solution.