venerdì 24 maggio 2013

Scherzi da ufficio: apertura del lettore cd.

La vita da ufficio, si sa, è noiosa. Per risollevare il morale, non c'è niente di meglio di un simpatico scherzetto.
Il prerequisito per la fattibilità della carognata, è la possibilità di accedere da remoto al pc del malcapitato di turno. Quindi munitevi di un account di dominio, un tool tipo psexec e questo simpatico script in vbscript da salvare come ejectCD.vbs

Const CDROM = 4
For Each d in CreateObject("Scripting.FileSystemObject").Drives
  If d.DriveType = CDROM Then
    Eject d.DriveLetter & ":\"  
  End If
Next

Sub Eject(CDROM)
  Dim ssfDrives
  ssfDrives = 17
  CreateObject("Shell.Application")_
    .Namespace(ssfDrives).ParseName(CDROM).InvokeVerb("Eject")
End Sub
Facciamo partire lo scherzone: si va in console nella directory dove avremo messo lo script e il psexec e si lanciano in sequenza i comandi:
C:\> psexec \\NomePcCollega -u utente -p password "cscript //H:CScript" 
C:\> psexec \\NomePcCollega -u utente -p password -c ejectCD.vbs
Il primo imposta di default l'esecutore dei vbs in console, il secondo fa partire lo script vero e proprio, dopo averlo copiato sul pc del malcapitato
Lo script va alla ricerca dei drive di tipo cdrom e per ognuno di essi lancia il comando Eject utilizzando la lettera che lo identifica (es F:\)

Schedulare l'apertura

Per rendere ancora più subdola la cosa, si può schedulare un task sul pc del collega per aprire il cdrom a intervalli regolari. Innanzitutto bisogna copiare lo script in una directory sul pc della povera vittima. Fatto? bene! Sempre con il psexec ci colleghiamo in console da remoto sul pc
C:\> psexec \\NomePcCollega -i -s -u utente -p password cmd.exe
oppure utilizzando il telnet se sul pc è attivo. Una volta ottenuta la console si schedula  un processo tramite il tool schtasks
C:\> schtask /Create /SC HOURLY /TN scherzone /TR ejectCD.vbs
In questo modo, se tutto va bene, abbiamo impostato l'apertura del cd del povero collega ogni ora.

Non nascondo che io l'ho messo in pratica con successo. Il malcapitato ha messo lo scotch sul lettore...

venerdì 10 maggio 2013

Clonare una VM con ESXi v5

Sono diventato il fortunato possessore di un server ESXi v5 sul quale far girare un po' di VM per i vari test. Una delle sfortune del suddetto server è che non ha tutte le fantastiche (e costose) features delle varie versioni superiori, in primis la clonazione. Fortunatamente grazie all'accesso ssh e un po' di console, si può tranquillamente portare a compimento l'operazione.

Attivare connessione SSH dal vSphere Client

Apriamo il client e ci connettiamo al server con un utente amministrativo. Nella tag configuration, si seleziona Security Profile e poi Properties.. nella sezione Services. Selezionando SSH e Options... si ha la possibilità di fare un bel Start. Fatto ciò ci si connette con utente root via ssh.

Clonare Disco

Giunti in console ci vengono in aiuto un sacco di tool. Il primo è vmkfstools che consente di fare la copia del disco virtuale. Requisito necessario è che la VM origine sia spenta, altrimenti non è possibile ottenere il lock esclusivo. Ci spostiamo quindi sul datastorage e lanciamo la copia del disco.
~ # cd /vmfs/volumes/4f466873-289b519c-2689-d067e5e5780e/vm1
/vmfs/volumes/4f466873-289b519c-2689-d067e5e5780e/vm1 # mkdir ../vm2
/vmfs/volumes/4f466873-289b519c-2689-d067e5e5780e/vm1 # vmkfstools -i vm1.vmdk ../vm2-vm2.vmkd
Destination disk format: VMFS zeroedthick
Cloning disk 'vm1.vmdk'...
Clone: 100% done.

Ecco fatto. A questo punto sarebbe sufficiente creare una nuova vm con il disco appena copiato. ma io sono pigro e quindi mi copio pure la configurazione.

Clonare Configurazione

Il file .vmx è un semplice file di testo. Si può quindi copiare tranquillamente e poi editare a mano.
/vmfs/volumes/4f466873-289b519c-2689-d067e5e5780e/vm1 # cp vm1.vmx ../vm2/vm2.vmx
si edita quindi il file vm2.vmx e si sostituiscono le occorrenze di nome, file del disco, file della memoria virtuale e file di swap, adattandoli a quelli appena creati, come ad esempio:
nvram = "vm2.nvram"
displayName = "vm2"
extendedConfigFile = "vm2.vmxf"
ide0:0.fileName = "vm2.vmdk"
sched.swap.derivedName = "/vmfs/volumes/4f466873-289b519c-2689-d067e5e5780e/XPPlcTestDebe/vm2-ab51994b.vswp"
 

Aggiungere la VM all'inventario

Abbiamo tutto quello che serve alla nuova VM. Registriamola, quindi, con il comando
~ # vim-cmd solo/registervm  /vmfs/volumes/4f466873-289b519c-2689-d067e5e5780e/vm2/vm2.vmx
che restituisce l'id della vm appena creata.
Attenzione che nel caso di windows bisogna poi cambiare l'hostname e il SID tramite il tool della sysinternals

Ciao
Debe

venerdì 3 maggio 2013

Cambiare IP al volo con Netsh + HTA

Quando scendo nei vari impianti dove lavoro mi capita di dover collegare il mio portatile su reti diverse (senza DHCP). Cambiare ogni volta l'indirizzo ip cliccando in giro per le varie voci di windows 7 non è abbastanza geek per me, per cui ho deciso di trovare un sistema più diretto.

Netsh

Questo tool, presente di serie sui sistemi windows dai tempi di xp, permette di configurare diversi aspetti della rete via shell (netsh -> net shell), tra cui ovviamente anche l'indirizzo ip.
Il netsh lavora per contesti, quindi prima di dare il comando vero e proprio si deve dichiarare in quale si lavora, nel nostro caso  interface ip. Per impostare l'indirizzo vero e proprio si utilizza set address con questa sintassi:
set address "nome interfaccia" static x.x.x.x y.y.y.y z.z.z.z
completando con il nome dell'interfaccia (di solito Local Area Network) e la famosa terna indirizzo ip, netmask e gateway.
Il comando completo quindi è:
netsh interface ip set address "Local Area Network" 192.168.1.10 255.255.255.0 192.168.1.1

HTA

Dato che comunque sono pigro e non ho voglia di scrivere un intero comando nella shell, ho pensato bene di accorciare il lavoro facendo una applicazione HTA (html application) che richiede le informazioni e lancia il comando di conseguenza.
L'HTA non è altro che una pagina web con un po' di VBScript dentro un file con estensione .hta.


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

 <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
 <title>Change IP Address</title>
 <HTA:APPLICATION ID="ChengeIP"
 APPLICATIONNAME="ChangeIP"
 CAPTION="yes"
 BORDER="thick"
 SCROLL="no"
 SHOWINTASKBAR="yes"
 SINGLEINSTANCE="yes"
 SYSMENU="yes"
 MINIMIZEBUTTON="yes"
 MAXIMIZEBUTTON="no"
 >
 <script language="VBscript">
 Sub Window_onLoad
 window.resizeto 380,300
 end Sub
 function ChangeIP(lsNetworkName, lsIp, lsNM, lsGateway)
 DIM objShell
 if lsIp <> "" then
 set objShell = CreateObject("wscript.shell")
 iReturn = objShell.Run("CMD /S netsh interface ipv4 set address """ & lsNetworkName & """ static " & lsIp & " " & lsNM & " " + lsGateway , , True)
 set objShell = Nothing
 end if
 end function
 </script>
</head>
<body bgcolor="#008040">
<p style="text-align:center">
Cambio IP
</p>


<table style="text-align: left; margin-left: auto; margin-right: auto; height: 100px; width: auto;" border="0" cellpadding="2" cellspacing="2">

  <tbody>

 <tr>

      <td style="width: 100px; height: 30px;">Network Name:</td>

      <td style="text-align: center; height: 30px; width: 212px;"><input style="width:200" name="NetworkName" value="Local Area Connection"><br></td>

    </tr>

    <tr>

      <td style="width: 100px; height: 30px;">IP:</td>

      <td style="text-align: center; height: 30px; width: 212px;"><input style="width:200" name="IP"><br></td>

    </tr>

    <tr>

      <td style="width: 100px; height: 30px;">Netmask:</td>

      <td style="text-align: center; height: 30px; width: 212px;"><input style="width:200" value="255.255.255.0" name="Netmask"></td>

    </tr>

    <tr>

      <td style="width: 100px; height: 30px;">Gateway:</td>

      <td style="text-align: center; height: 30px; width: 212px;"><input style="width:200" value="" name="Gateway" ></td>

    </tr>

  </tbody>

</table>

<br>

<div style="text-align: center;"><button onclick="call ChangeIP(NetworkName.value, IP.value, Netmask.value, Gateway.value)" name="Cambia IP" type="button" style="CURSOR: hand">Cambia IP</button><br>

</div>
</body>
</html>