Risoluzione problema con i Database Diagrams di Sql Server 2005

Scenario : Sql Server 2005 con un database appena creato tramite uno script

Problema : Non si riescono a creare Database Diagrams, in quanto il supporto per la funzionalità stessa non è presente e ad ogni tentativo viene visualizzata una dialog di errore con scritto il messaggio : “Database diagram support objects cannot be installed because this database does not have a valid owner. To continue, first use the Files page of the Database Properties dialog box or the ALTER AUTHORIZATION statement to set the database owner to a valid login, then add the database diagram support objects.”. Andando nelle proprietà del database, seguendo le indicazioni del messaggio non sembra risolversi il problema.
Soluzione : Eseguire il seguente script :

use [master]
EXEC sp_dbcmptlevel 'yourDB', '90';
go
ALTER AUTHORIZATION ON DATABASE::yourDB TO "yourLogin"
go
use [yourDB]
go
EXECUTE AS USER = N'dbo' REVERT
go



			
Risoluzione problema con i Database Diagrams di Sql Server 2005

Rimozione del worm Bagle

Sabato scorso ho cominciato la giornata con una doccia fredda. Ho subìto un attacco del worm Bagle.
La manifestazione del worm si è concretizzata in pochi minuti in :

  • disattivazione del mio antivirus (McAfee)
  • disattivazione del mio personal firewall (ZoneAlarm)
  • disattivazione di molti servizi di sistema
  • disattivazione di parecchie credenziali di accesso/modifica, specialmente al registro di sistema
  • inibizione dell’accesso al sistema nella modalità provvisoria
  • inibizione della reinstallazione e/o esecuzione di firewall/antivirus

Ovviamente questo mi ha parecchio sconfortato, e ho temuto il peggio. Infatti non riuscivo a fare niente, viste tutte le azioni messe in atto dal worm ed elencate prima.
Per fortuna, tramite un altro pc in casa, mi sono messo in cerca su internet di informazioni e tools che mi potessero aiutare, e ho trovato parecchia roba. Ma i tool specifici in realtà non mi sono stati di grande aiuto. Piuttosto una serie di operazioni manuali, mi ha salvato. Di seguito riporto i passi da seguire, frutto di un copia e incolla da diverse fonti, siti, post e altro, motivo per il quale scrivo questo post, sperando serva ad accelerare la risoluzione per qualcun altro.

Premetto che :

  • per fare tutto ciò è necessario entrare con una utenza di amministratore (che era poi l’utenza che è stata attaccata dal worm nel mio caso)
  • tutto quanto di seguito indicato, si riferisce ad un sistema Windows XP Professional +sp2, per cui nel caso di altri sistemi potrebbero esserci differenze riguardo i nomi delle directory (winnt ad esempio invece di windows, se si lavora sul 2000)

1. Ripristino Accesso in Modalità Provvisoria

Per ripristinare la modalità provvisoria ho portato ed eseguito (da una chiavetta usb) uno script reg sulla macchina colpita:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Ndisuio]
"Start"=dword:00000003
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Rpc]
"UuidSequenceNumber"=dword:0cdae01e
[HKEY_CURRENT_USER\Session\Information]
"ProgramCount"=dword:00000004

Dopo aver ripristinato questa funzionalità, riavviare la macchina ed entrare in modalità provvisoria (sempre come amministratore).

2. Cancellazione files

Cancellare tutti i file presenti, tra quelli indicati di seguito. Le indicazioni di seguito riportate, indicano con %SystemDrive% il disco (normalmente C) dove è installato il sistema operativo, e con %UserProfile% l’utenza (amministratore) con cui si sta operando:

  • %SystemDrive%\Documents and Settings\%UserProfile%\Dati applicazioni\hidires\m_hook.sys
  • %SystemDrive%\Documents and Settings\%UserProfile%\Dati applicazioni\hidires\hidr.exe
  • %SystemDrive%\Documents and Settings\%UserProfile%\Dati applicazioni\hidires\rosa.sys
  • %SystemDrive%\WINDOWS\system32\wintems.exe
  • %SystemDrive%\WINDOWS\system32\hldrrr.exe
  • %SystemDrive%\WINDOWS\system32\trusted.exe
  • %SystemDrive%\WINDOWS\system32\drivers\hidr.exe
  • %SystemDrive%\WINDOWS\system32\drivers\srosa.sys
  • %SystemDrive%\WINDOWS\system32\drivers\pci32.sys

3. Cancellazione directory

Cancellare tutte le directory presenti, tra quelle indicate di seguito:

  • %SystemDrive%\Documents and Settings\%UserProfile%\Dati applicazioni\hidires
  • %SystemDrive%\WINDOWS\exefnd
  • %SystemDrive%\WINDOWS\exefld

4. Cancellazione chiavi di registro

Tramite regedit.exe cancellate le chiavi di registro presenti, tra quelle di seguito elencate:

  • HKLM\SYSTEM\CurrentControlSet\Services\m_hook
  • HKLM\SYSTEM\CurrentControlSet\Services\rosa
  • HKLM\SYSTEM\CurrentControlSet\Services\srosa
  • HKLM\SYSTEM\CurrentControlSet\Services\pci32
  • HKLM\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_M_HOOK
  • HKLM\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_rosa
  • HKLM\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_SROSA
  • HKLM\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_PCI32
  • HKCU\Software\DateTime4
  • HKCU\Software\FirstRRRun

5. Cancellazione voci di registro

Ancora con regedit.exe verificate se esistono le seguenti voci nel registro, e nel caso cancellatele:

  • HKLM\Software\Microsoft\Windows\CurrentVersion\Run
    • hldrr
    • hldrrr
    • rvsyskit
    • german.exe

6. Eliminazione File Temporanei

Eliminare dalla cartella:

%SystemDrive%\Documents And Settings\%UserProfile%\Dati Applicazioni\Impostazioni Locali\Temp\

tutti i file *.exe e *.tmp in quanto qualcuno di loro potrebbe essere una copia infetta del worm in questione.

7. Riattivazione Servizi Disabilitati

Eseguire l’applicativo di gestione dei servizi, tramite il comando Services.msc, ed abilitare, se disabilitati i seguenti servizi, riportando in Automatico l’avvio degli stessi:

  • Avvisi
  • Centro sicurezza PC
  • Aggiornamenti automatici
  • Connessioni di rete
  • Zero Configuration reti senza fili
  • Windows Firewall/ Condivisione connessinoe Internet (ICS)

8. Reinstallazione Antivirus e Firewall

Procedete con l’installazione ex-novo dell’antivirus e del firewall che sono stati travolti da Bagle e quindi riavviare, facendo come prima operazione al riavvio la scansione dell’intero disco, sia con l’antivirus che con un eventuale altro antispyware.

La cosa migliore, comunque, è quella di non avere mai bisogno di questa procedura.

Rimozione del worm Bagle

Simulare un wordwrap su listbox in C#

Alcune volte è necessario inserire in una listbox delle righe (negli items) che vanno oltre la larghezza della listbox stessa.

Il controllo in sè non ha le proprietà, ma neanche le responsabilità, per decidere come e quando tagliare le righe inserite.

Ovviamente questo è un esempio e va preso così com’è. Modificatelo poi per il vostro caso specifico.

– innanzitutto la proprietà DrawMode della listbox va posta a OwnerDrawFixed;
– quindi si deve definire un gestore per l’evento DrawItem della stessa listbox, come di seguito indicato :

private void ListBoxcheckuser_DrawItem(object sender, DrawItemEventArgs e)
{
ListBox myListbox = (ListBox)sender;
// disegna il background e definisco il brush
e.DrawBackground();
Brush myBrush = Brushes.Black;
// la stringa da mostrare nella riga
string sTextToDisplay =
myListbox.Items[e.Index].ToString();
// stabilisco la larghezza massima di ogni riga, in caratteri
int iLength = 50;
// se la lunghezza della stringa supera quella visibile, la taglio e
// faccio l'insert delle righe a seguire
if (sTextToDisplay.Length > iLength)
{
// ottengo il primo blocco (per la riga corrente)
string sFirstBlock = sTextToDisplay.Substring(0, iLength - 1);
// e quindi il secondo blocco (il rimanente della riga)
string sSecondBlock = sTextToDisplay.Remove(0, iLength - 1);
// assegno il primo blocco alla riga corrente (che ora
è stata modificata)
myListbox.Items[e.Index] = sFirstBlock; //
questa riga è fondamentale;
// inserisco la nuova riga all'indice successivo
// questo farà scattare nuovamente questo evento, per
la riga in questione
myListbox.Items.Insert(e.Index + 1, sSecondBlock);
// riporto il valore da stampare (disegnare)
sTextToDisplay = sFirstBlock;
}
// disegno il testo per la riga corrente (o quello che ne rimane)
e.Graphics.DrawString(sTextToDisplay, e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);
// assegno il focus al rectangle se necessario
e.DrawFocusRectangle();
}

questo ti consente di determinare una lunghezza massima in caratteri del testo che viene inserito nella textbox;
l’unico svantaggio è che non è dinamico in base al font; a questo si può rimediare ragionando in termini di pixel, vedendo di volta in volta la larghezza della stringa da scrivere rispetto alla larghezza della listbox, tramite il metodo :

// ottengo il primo blocco (per la riga corrente)
int iPixel = TextRenderer.MeasureText(myString, myFont).Width;

ma è un’alternativa ancor più faticosa della prima, e poco gestibile (per il fatto che il DrawItem viene rilanciato ad ogni visualizzazione/refresh del controllo/della pagina)…

Pensavo che queste seghe mentali soluzioni geniali fossero solo un ricordo dell’epoca di Delphi

Simulare un wordwrap su listbox in C#