tag:blogger.com,1999:blog-6272680983600040312024-03-13T18:22:46.228-07:00Yet Another Stupid BlogApenas Mais um Blog "estúpido" e inútil, com how-to's e tralha!Yet Another Stupid Bloghttp://www.blogger.com/profile/15281400804837781865noreply@blogger.comBlogger16125tag:blogger.com,1999:blog-627268098360004031.post-10088207289316638982014-05-19T02:21:00.003-07:002016-01-25T14:28:15.937-08:00O problema das Cifras... E a dor de cabeça que levou uma noite a resolver!Recentemente num projecto em que estive a trabalhar, tive de cifrar uma quantidade considerável de dados. A primeira coisa que me surgiu na mente foi usar hash, mas a necessidade de reverter a string cifrada para plain-text invalidou essa ideia.<br />
<br />
Foi por essa altura que pensei "bem isto era porreiro encriptar em AES!", mas aí surgiu-me uma outra questão: Como o fazer ? Como gerar key-rings para cada registo ?
Depois de indagar umas horas, acabei adoptando uma forma de encriptar registos e desencripar os mesmos de forma simples e quase instantânea, usando key-rings diferentes para cada registo.
<b> </b><br />
<br />
<b>Problemas:</b><b> </b><br />
<ul>
<li>Não repetir key-rings</li>
<li>Evitar paterns</li>
<li>Encriptar quantidades massivas de dados<b> </b></li>
<li>Fazê-lo de forma minimamente robusta<b> </b></li>
</ul>
<b>A solução:</b><br />
<br />
Umas pesquisas na web, não resultaram em grande coisa. Ou encontrava implementações que não funcionávam, ou tinham memory leaks, e nenhuma delas fazia tudo o que eu precisava.<br />
<br />
Chegado a esta conclusão "volta-se ao quadro e desenha-se"! Depois de muitos rabiscos, lá começou a tomar forma aquilo que eu pretendia.<br />
<br />
Uma classe que gera-se strings aleatórias de tamanho definido no construtor, e uma classe que suporta-se a encriptação, AES usando algoritmo Rijndael. Nesta faze decidi colocar a private key hardcoded na app, uma vez que o meu objectivo não se concentrava em proteger a app, mas proteger os dados, e o elo mais fraco seria o servidor de base de dados.<br />
<br />
<br />
Neste caso a classe que encriptaria os dados é a seguinte:<br />
<br />
Class: EncryptStringDino<b> </b><br />
<b> </b>
<br />
<pre class="brush:csharp" style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlixXpSazal07Fyb_tWRgNCapV4trOc-cuf5BVaGXAdqYGXKGYcSGHprVVORzRhrMHsggtH94D1BQroVmCc7erndw1EmbWIdR38uP5l-WoAlrHRPM2fNtnDqAeWpOm9sb0i4sNKv4kwpUq/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;">
using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace EncryptStringDino
{
public static class StringCipher
{
private const string initVector = "EfK7yhF3HKywfvXp";
private const int keysize = 256;
//sumary
//metodo Encrypt
//exemplo: string cifrado = Encrypt(texto_a_cifrar, key)
//key é uma contra-senha que tanto pode ser uma constante como um valor de uma veriável
//devolve uma string correspondente ao texto a cifrar, cifrado recorrendo ao standard AES metodologia Rijndael
public static string Encrypt(string plainText, string passPhrase)
{
byte[] initVectorBytes = Encoding.UTF8.GetBytes(initVector);
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null);
byte[] keyBytes = password.GetBytes(keysize / 8);
RijndaelManaged symmetricKey = new RijndaelManaged();
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] cipherTextBytes = memoryStream.ToArray();
memoryStream.Close();
cryptoStream.Close();
return Convert.ToBase64String(cipherTextBytes);
}
//sumary
//metodo Dncrypt
//exemplo: string cifrado = Encrypt(texto_cifrado, key)
//key é uma contra-senha que tanto pode ser uma constante como um valor de uma veriável
//devolve uma string correspondente ao texto a cifrar, cifrado recorrendo ao standard AES metodologia Rijndael
public static string Decrypt(string cipherText, string passPhrase)
{
byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null);
byte[] keyBytes = password.GetBytes(keysize / 8);
RijndaelManaged symmetricKey = new RijndaelManaged();
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);
MemoryStream memoryStream = new MemoryStream(cipherTextBytes);
CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
byte[] plainTextBytes = new byte[cipherTextBytes.Length];
int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
memoryStream.Close();
cryptoStream.Close();
return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
}
}
}
</code>
</pre>
<br />
<b> </b>Class: RamdomStringGeneratorDino , que vai gerar as strings aleatórias que vão fazer parte do processo de encriptação.<br />
<br />
Este código foi alterado diversas vezes porque causava constantemente erros e problemas com a CLR, ao ponto de ter de ser alterado de novo, quando começou a gerar exceptions quando pedido que gera-se um volume de cerca de 2000 strings.<b> </b><br />
<br />
<b>Class: RamdomStringGeneratorDino </b><br />
<b> </b>
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlixXpSazal07Fyb_tWRgNCapV4trOc-cuf5BVaGXAdqYGXKGYcSGHprVVORzRhrMHsggtH94D1BQroVmCc7erndw1EmbWIdR38uP5l-WoAlrHRPM2fNtnDqAeWpOm9sb0i4sNKv4kwpUq/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
namespace RamdomStringGeneratorDino
{
/// <summary>
/// Classe geradora de strings aleatórias de acordo com as opções abaixo listadas
/// 1) 4 caracteres (maiusculo, minusculo, numerico e caracteres especiais)
/// 2) numero variável de caracteres em uso
/// 3) numero minimo de caracteres de cada tipo a serem usados na string
/// 4) Geração orientada a patterns
/// 5) geração de strings unicas
/// 6) usar cada caracter apenas uma vez
/// feito para gerar "keyt" para senhas Rjindael
/// </summary>
public class RandomStringGenerator
{
public RandomStringGenerator(bool UseUpperCaseCharacters = true,
bool UseLowerCaseCharacters = true,
bool UseNumericCharacters = true,
bool UseSpecialCharacters = true)
{
m_UseUpperCaseCharacters = UseUpperCaseCharacters;
m_UseLowerCaseCharacters = UseLowerCaseCharacters;
m_UseNumericCharacters = UseNumericCharacters;
m_UseSpecialCharacters = UseSpecialCharacters;
CurrentGeneralCharacters = new char[0]; // evita excepções de null
UpperCaseCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
LowerCaseCharacters = "abcdefghijklmnopqrstuvwxyz".ToCharArray();
NumericCharacters = "0123456789".ToCharArray();
SpecialCharacters = ",.;:?!/@#$%^&()=+*-_{}[]<>|~".ToCharArray();
MinUpperCaseCharacters = MinLowerCaseCharacters = MinNumericCharacters = MinSpecialCharacters = 0;
RepeatCharacters = true;
PatternDriven = false;
Pattern = "";
Random = new RNGCryptoServiceProvider();
ExistingStrings = new List<string>();
}
#region character sets managers
/// <summary>
/// True se precisar-mos de um numero de caracteres fixo
/// </summary>
public bool UseUpperCaseCharacters
{
get
{
return m_UseUpperCaseCharacters;
}
set
{
if (CurrentUpperCaseCharacters != null)
CurrentGeneralCharacters = CurrentGeneralCharacters.Except(CurrentUpperCaseCharacters).ToArray();
if (value)
CurrentGeneralCharacters = CurrentGeneralCharacters.Concat(CurrentUpperCaseCharacters).ToArray();
m_UseUpperCaseCharacters = value;
}
}
/// <summary>
/// define ou obter a definição de caracteres maiusculos.
/// </summary>
public char[] UpperCaseCharacters
{
get
{
return CurrentUpperCaseCharacters;
}
set
{
if (UseUpperCaseCharacters)
{
if (CurrentUpperCaseCharacters != null)
CurrentGeneralCharacters = CurrentGeneralCharacters.Except(CurrentUpperCaseCharacters).ToArray();
CurrentGeneralCharacters = CurrentGeneralCharacters.Concat(value).ToArray();
}
CurrentUpperCaseCharacters = value;
}
}
/// <summary>
/// True se é obritatório o uso de minusculas
/// </summary>
public bool UseLowerCaseCharacters
{
get
{
return m_UseLowerCaseCharacters;
}
set
{
if (CurrentLowerCaseCharacters != null)
CurrentGeneralCharacters = CurrentGeneralCharacters.Except(CurrentLowerCaseCharacters).ToArray();
if (value)
CurrentGeneralCharacters = CurrentGeneralCharacters.Concat(CurrentLowerCaseCharacters).ToArray();
m_UseLowerCaseCharacters = value;
}
}
/// <summary>
/// define ou obtem a definição de uso de caracteres minusculos
/// </summary>
public char[] LowerCaseCharacters
{
get
{
return CurrentLowerCaseCharacters;
}
set
{
if (UseLowerCaseCharacters)
{
if (CurrentLowerCaseCharacters != null)
CurrentGeneralCharacters = CurrentGeneralCharacters.Except(CurrentLowerCaseCharacters).ToArray();
CurrentGeneralCharacters = CurrentGeneralCharacters.Concat(value).ToArray();
}
CurrentLowerCaseCharacters = value;
}
}
/// <summary>
/// True se é necessário o uso de caracteres numéricos
/// </summary>
public bool UseNumericCharacters
{
get
{
return m_UseNumericCharacters;
}
set
{
if (CurrentNumericCharacters != null)
CurrentGeneralCharacters = CurrentGeneralCharacters.Except(CurrentNumericCharacters).ToArray();
if (value)
CurrentGeneralCharacters = CurrentGeneralCharacters.Concat(CurrentNumericCharacters).ToArray();
m_UseNumericCharacters = value;
}
}
/// <summary>
/// define ou obtem a definição de uso de caracteres numéricos
/// </summary>
public char[] NumericCharacters
{
get
{
return CurrentNumericCharacters;
}
set
{
if (UseNumericCharacters)
{
if (CurrentNumericCharacters != null)
CurrentGeneralCharacters = CurrentGeneralCharacters.Except(CurrentNumericCharacters).ToArray();
CurrentGeneralCharacters = CurrentGeneralCharacters.Concat(value).ToArray();
}
CurrentNumericCharacters = value;
}
}
/// <summary>
/// True se é para usar caracteres especiais
/// </summary>
public bool UseSpecialCharacters
{
get
{
return m_UseSpecialCharacters;
}
set
{
if (CurrentSpecialCharacters != null)
CurrentGeneralCharacters = CurrentGeneralCharacters.Except(CurrentSpecialCharacters).ToArray();
if (value)
CurrentGeneralCharacters = CurrentGeneralCharacters.Concat(CurrentSpecialCharacters).ToArray();
m_UseSpecialCharacters = value;
}
}
/// <summary>
/// define ou obtem a definição de uso de caracteres especiais
/// </summary>
public char[] SpecialCharacters
{
get
{
return CurrentSpecialCharacters;
}
set
{
if (UseSpecialCharacters)
{
if (CurrentSpecialCharacters != null)
CurrentGeneralCharacters = CurrentGeneralCharacters.Except(CurrentSpecialCharacters).ToArray();
CurrentGeneralCharacters = CurrentGeneralCharacters.Concat(value).ToArray();
}
CurrentSpecialCharacters = value;
}
}
#endregion
#region character limits
/// <summary>
/// Define ou obtem o numero minumo de caracteres maiusculos a serem usados.
/// </summary>
public int MinUpperCaseCharacters
{
get { return m_MinUpperCaseCharacters; }
set { m_MinUpperCaseCharacters = value; }
}
/// <summary>
/// Define ou obtem o numero minimo de caracteres minusculos a serem usados.
/// </summary>
public int MinLowerCaseCharacters
{
get { return m_MinLowerCaseCharacters; }
set { m_MinLowerCaseCharacters = value; }
}
/// <summary>
/// define ou obtem o numero minimo de caracteres numéricos a sere utilizados.
/// </summary>
public int MinNumericCharacters
{
get { return m_MinNumericCharacters; }
set { m_MinNumericCharacters = value; }
}
/// <summary>
/// define ou obtem o numero minimo de caracteres especiais a serem utilizados.
/// </summary>
public int MinSpecialCharacters
{
get { return m_MinSpecialCharacters; }
set { m_MinSpecialCharacters = value; }
}
#endregion
#region pattern
private string m_pattern;
/// <summary>
/// Define o padrão a ser seguido para gerar uma string.
/// Este valor é ignorado se for igual string vazia.
/// Os padrões são:
/// L - para letra maiúscula
/// L - para letra minúscula
/// N - de número
/// S - para caractere especial
/// * - Para qualquer caractere
/// </summary>
private string Pattern
{
get
{
return m_pattern;
}
set
{
if (!value.Equals(String.Empty))
PatternDriven = true;
else
PatternDriven = false;
m_pattern = value;
}
}
#endregion
#region generators
/// <summary>
/// Gerar uma string que segue o padrão.
/// Caracteres possíveis são:
/// L - para letra maiúscula
/// L - para letra minúscula
/// N - de número
/// S - para caractere especial
/// * - Para qualquer caracter
/// </summary>
/// <param name="Pattern">o pattern na ser seguido enquanto gera as strings</param>
/// <returns>um padrão aleatório que é retornado após a geração</returns>
public string Generate(string Pattern)
{
this.Pattern = Pattern;
string res = GenerateString(Pattern.Length);
this.Pattern = "";
return res;
}
/// <summary>
/// gera uma string de comprimento variável compreendido entre MinLength e MaxLength. Os caracteres
/// devem ser definidos antes de ser chamada esta função
/// </summary>
/// <param name="MinLength">cumprimento minimo da string string</param>
/// <param name="MaxLength">Cumprimento maximo da string</param>
/// <returns>uma string aleatória de um tamanho compreendido entre o minimo e o maximo</returns>
public string Generate(int MinLength, int MaxLength)
{
if (MaxLength < MinLength)
throw new ArgumentException("Maximal length should be grater than minumal");
int length = MinLength + (GetRandomInt() % (MaxLength - MinLength));
return GenerateString(length);
}
/// <summary>
/// Gera uma string de comprimento fixo
/// os conjuntos de caracteres utilizaveis devem ser definidos antes de chamar esta função
/// </summary>
/// <param name="FixedLength">cumprimento da string</param>
/// <returns>uma string aleatória do comprimento desejado</returns>
public string Generate(int FixedLength)
{
return GenerateString(FixedLength);
}
/// <summary>
/// Metodo de geração principal que escolhe o metodo de geração adequado.
/// procura situações excepcionais também.
/// </summary>
private string GenerateString(int length)
{
if (length == 0)
throw new ArgumentException("Não se pode gerar uma string com zero caracteres");
if (!UseUpperCaseCharacters && !UseLowerCaseCharacters && !UseNumericCharacters && !UseSpecialCharacters)
throw new ArgumentException("Tem de se usar pelo menos um conjunto de caracteres! É que é burro alvin! :D");
if (!RepeatCharacters && (CurrentGeneralCharacters.Length < length))
throw new ArgumentException("não existem caracteres suficientes para gerar a string sem repetir caracteres");
string result = ""; // Esta string contem o resultado
if (PatternDriven)
{
// usando a pattern para gerar algo
result = PatternDrivenAlgo(Pattern);
}
else if (MinUpperCaseCharacters == 0 && MinLowerCaseCharacters == 0 &&
MinNumericCharacters == 0 && MinSpecialCharacters == 0)
{
// usando o algoritmo mais simples, neste caso
result = SimpleGenerateAlgo(length);
}
else
{
// atenção ao limite
result = GenerateAlgoWithLimits(length);
}
// suporte para strings unicas
// recursão, a possibilidade de stack overflow é grande para strings maiores que 3 chars.
try
{
if (UniqueStrings && ExistingStrings.Contains(result))
return GenerateString(length);
AddExistingString(result); // guarda histórico
}
catch { throw; }// intercepta o overflow e manda-o de volta (pro raio que o parta)
return result;
}
/// <summary>
/// gera uma string aleatória baseada na pattern
/// </summary>
private string PatternDrivenAlgo(string Pattern)
{
string result = "";
List<char> Characters = new List<char>();
foreach (char character in Pattern.ToCharArray())
{
char newChar = ' ';
switch (character)
{
case 'L':
{
newChar = GetRandomCharFromArray(CurrentUpperCaseCharacters, Characters);
break;
}
case 'l':
{
newChar = GetRandomCharFromArray(CurrentLowerCaseCharacters, Characters);
break;
}
case 'n':
{
newChar = GetRandomCharFromArray(CurrentNumericCharacters, Characters);
break;
}
case 's':
{
newChar = GetRandomCharFromArray(CurrentSpecialCharacters, Characters);
break;
}
case '*':
{
newChar = GetRandomCharFromArray(CurrentGeneralCharacters, Characters);
break;
}
default:
{
throw new Exception("O caracter '" + character + "' não é suportado");
}
}
Characters.Add(newChar);
result += newChar;
}
return result;
}
/// <summary>
///
///
/// </summary>
private string SimpleGenerateAlgo(int length)
{
string result = "";
for (int i = 0; i < length; i++)
{
char newChar = CurrentGeneralCharacters[GetRandomInt() % CurrentGeneralCharacters.Length];
if (!RepeatCharacters && result.Contains(newChar))
{
do
{
newChar = CurrentGeneralCharacters[GetRandomInt() % CurrentGeneralCharacters.Length];
} while (result.Contains(newChar));
}
result += newChar;
}
return result;
}
/// <summary>
///
/// </summary>
private string GenerateAlgoWithLimits(int length)
{
if (MinUpperCaseCharacters + MinLowerCaseCharacters +
MinNumericCharacters + MinSpecialCharacters > length)
{
throw new ArgumentException("Sum of MinUpperCaseCharacters, MinLowerCaseCharacters," +
" MinNumericCharacters and MinSpecialCharacters is greater than length");
}
if (!RepeatCharacters && (MinUpperCaseCharacters > CurrentUpperCaseCharacters.Length))
throw new ArgumentException("Can't generate a string with this number of MinUpperCaseCharacters");
if (!RepeatCharacters && (MinLowerCaseCharacters > CurrentLowerCaseCharacters.Length))
throw new ArgumentException("Can't generate a string with this number of MinLowerCaseCharacters");
if (!RepeatCharacters && (MinNumericCharacters > CurrentNumericCharacters.Length))
throw new ArgumentException("Can't generate a string with this number of MinNumericCharacters");
if (!RepeatCharacters && (MinSpecialCharacters > CurrentSpecialCharacters.Length))
throw new ArgumentException("Can't generate a string with this number of MinSpecialCharacters");
int AllowedNumberOfGeneralChatacters = length - MinUpperCaseCharacters - MinLowerCaseCharacters
- MinNumericCharacters - MinSpecialCharacters;
string result = "";
List<char> Characters = new List<char>();
for (int i = 0; i < MinUpperCaseCharacters; i++)
Characters.Add(GetRandomCharFromArray(UpperCaseCharacters, Characters));
for (int i = 0; i < MinLowerCaseCharacters; i++)
Characters.Add(GetRandomCharFromArray(LowerCaseCharacters, Characters));
for (int i = 0; i < MinNumericCharacters; i++)
Characters.Add(GetRandomCharFromArray(NumericCharacters, Characters));
for (int i = 0; i < MinSpecialCharacters; i++)
Characters.Add(GetRandomCharFromArray(SpecialCharacters, Characters));
for (int i = 0; i < AllowedNumberOfGeneralChatacters; i++)
Characters.Add(GetRandomCharFromArray(CurrentGeneralCharacters, Characters));
for (int i = 0; i < length; i++)
{
int position = GetRandomInt() % Characters.Count;
char CurrentChar = Characters[position];
Characters.RemoveAt(position);
result += CurrentChar;
}
return result;
}
#endregion
public bool RepeatCharacters;
public bool UniqueStrings;
public void AddExistingString(string s)
{
ExistingStrings.Add(s);
}
#region misc tools
private int GetRandomInt()
{
byte[] buffer = new byte[2]; // 16 bit = 2^16 = 65576
Random.GetNonZeroBytes(buffer);
int index = BitConverter.ToInt16(buffer, 0);
if (index < 0)
index = -index; //handle de numeros negativos
return index;
}
private char GetRandomCharFromArray(char[] array, List<char> existentItems)
{
char Character = ' ';
do
{
Character = array[GetRandomInt() % array.Length];
} while (!RepeatCharacters && existentItems.Contains(Character));
return Character;
}
#endregion
#region internal state
private bool m_UseUpperCaseCharacters, m_UseLowerCaseCharacters, m_UseNumericCharacters, m_UseSpecialCharacters;
private int m_MinUpperCaseCharacters, m_MinLowerCaseCharacters, m_MinNumericCharacters, m_MinSpecialCharacters;
private bool PatternDriven;
private char[] CurrentUpperCaseCharacters;
private char[] CurrentLowerCaseCharacters;
private char[] CurrentNumericCharacters;
private char[] CurrentSpecialCharacters;
private char[] CurrentGeneralCharacters;
private RNGCryptoServiceProvider Random;
private List<string> ExistingStrings;
#endregion
}
}
</code></pre>
<br />
E por fim o código que utilizei para cifrar os dados, depois de os ter numa datagridview em windows forms:<br />
<br />
<b> </b>
<b> </b>
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlixXpSazal07Fyb_tWRgNCapV4trOc-cuf5BVaGXAdqYGXKGYcSGHprVVORzRhrMHsggtH94D1BQroVmCc7erndw1EmbWIdR38uP5l-WoAlrHRPM2fNtnDqAeWpOm9sb0i4sNKv4kwpUq/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> foreach (DataGridViewCell cell in row.Cells)
{
deviceid = row.Cells[0].Value.ToString();
plainText = row.Cells[3].Value.ToString(); //lê o código da celula 4 da grid passPhrase = RSG.Generate(7); //gera a contrasenha
passcritped = EncryptStringDino.StringCipher.Encrypt(plainText, passPhrase); //encripta e armazena o valor na variável na passcripted
SqlCommand commands2 = new SqlCommand("UPDATE tabela SET codigo = '" + passcritped + "' , key = '" + passPhrase + "' WHERE campo1 = '" + arg1 + "' ;", conex); //conex é a conection string à base de dados
commands2.ExecuteNonQuery();
richTextBox1.AppendText(Environment.NewLine + arg1 + ";");
}
</code></pre>
<b> </b>
<br />
E pronto, foi esta a solução que dei à questão.<br />
<br />
Provávelmente existem soluções melhores que esta. De futuro pensarei noutras. Também estou a ponderar portar ambas as classes para .net 4.5 usando async e await para evitar alguma lentidão quando o volume de registos é grande.<br />
<br />
E pronto, fica aqui um pedaço de código que pode dar jeito a alguém e foi implementado numa noite de insónias.<br />
<br />
"Enquanto houver paixão pela programação e café... Haverá código!"António Cunha Santoshttp://www.blogger.com/profile/09649579046978437267noreply@blogger.com0tag:blogger.com,1999:blog-627268098360004031.post-31515169178693548092014-03-31T10:27:00.001-07:002014-03-31T12:21:38.136-07:00Dias uteis (WorkDays) do Excell mas mais completo<div style="text-align: center;">
Dias e horas úteis</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: left;">
Mais um desafio que recentemente tive de superar, num projecto. Engraçado foi o quão simples é a solução e o quão rebuscada a mente consegue ser para a encontrar.</div>
<div style="text-align: left;">
<br />
Neste caso uma simples classe em C# permite achar as horas uteis decorridas entre duas datas e horas, sendo estas passadas como objectos Datetime.<br />
<br />
Outras particularidades da classe é asseitar como parametro os dias feriados (excludeDays), que com pouco código até podem vir de uma tabela de uma BD.<br />
<br />
Achei engraçada a facilidade com que se consegue instanciar, fazer os calculos e obter o tempo decorrido com precisão ao segundo.<br />
<br /></div>
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlixXpSazal07Fyb_tWRgNCapV4trOc-cuf5BVaGXAdqYGXKGYcSGHprVVORzRhrMHsggtH94D1BQroVmCc7erndw1EmbWIdR38uP5l-WoAlrHRPM2fNtnDqAeWpOm9sb0i4sNKv4kwpUq/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;">using System;
using System.Linq;
namespace duteis
{
public class uteis
{
private TimeSpan startingTime;
private TimeSpan endingTime;
private DayOfWeek[] excludeDays;
public uteis(TimeSpan? startingTime, TimeSpan? endingTime, DayOfWeek[] excludeDays)
{
this.startingTime = startingTime ?? new TimeSpan(8, 30, 0);
this.endingTime = endingTime ?? new TimeSpan(17, 30, 0);
this.excludeDays = excludeDays ?? new DayOfWeek[]
{
DayOfWeek.Saturday ,
DayOfWeek.Sunday
};
}
public uteis()
: this(null, null, null)
{
}
public double Calculate(DateTime startDate, DateTime endDate)
{
var counter = startDate;
double hours = 0;
while (counter <= endDate)
{
var dayStart = counter.Date.Add(startingTime);
var dayEnd = counter.Date.Add(endingTime);
var nextDayStart = startDate.Date.Add(startingTime).AddDays(1);
if (counter < dayStart)
counter = dayStart;
if (excludeDays == null ||
excludeDays.Contains(counter.DayOfWeek) == false)
{
if (endDate < nextDayStart)
{
var ticks = Math.Min(endDate.Ticks, dayEnd.Ticks) - counter.Ticks;
hours = TimeSpan.FromTicks(ticks).TotalHours;
break;
}
else if (counter.Date == startDate.Date)
{
if (counter >= dayStart && counter <= dayEnd)
{
hours += (dayEnd - counter).TotalHours;
}
}
else if (counter.Date == endDate.Date &&
startDate.Date != endDate.Date)
{
if (counter >= dayStart && counter <= dayEnd)
{
hours += (counter - dayStart).TotalHours;
}
else if (counter > dayEnd)
{
hours += (endingTime - startingTime).TotalHours;
}
}
else
{
hours += (endingTime - startingTime).TotalHours;
}
}
counter = counter.AddDays(1);
if (counter.Date == endDate.Date)
counter = endDate;
}
return hours;
}
}
}</code></pre>
<br />
<br />
Atenção a estas linhas onde se define a duração do dia ùtil, e são tratados os "excludeDays" que podem ser os feriados como escrevi anteriormente.<br />
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlixXpSazal07Fyb_tWRgNCapV4trOc-cuf5BVaGXAdqYGXKGYcSGHprVVORzRhrMHsggtH94D1BQroVmCc7erndw1EmbWIdR38uP5l-WoAlrHRPM2fNtnDqAeWpOm9sb0i4sNKv4kwpUq/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;">this.startingTime = startingTime ?? new TimeSpan(8, 30, 0);
this.endingTime = endingTime ?? new TimeSpan(17, 30, 0);
this.excludeDays = excludeDays ?? new DayOfWeek[] </code></pre>
<div style="text-align: left;">
<br /></div>
António Cunha Santoshttp://www.blogger.com/profile/09649579046978437267noreply@blogger.com0tag:blogger.com,1999:blog-627268098360004031.post-12175668194673903702014-03-31T06:50:00.002-07:002014-03-31T06:50:22.514-07:00Eliminar duplicados numa tabela SQLNos ultimos tempos tenho-me deparado com desafios cada vez mais interessantes e incomuns.<br />
<br />
Desta feita, precisei de localizar e eliminar de forma eficiente registos duplicados numa tabela, onde não existia um campo identificador unico nem um autonumber, ou outro que me permitisse isolar duplicados e eliminar apenas os duplicados, deixando um registo e não as várias duplicações do mesmo.<br />
<br />
Aqui fica o script feito para resolver esta questão, na esperança que seja útil para mais alguém! Porque cooperar é mais produtivo que competir.<br />
<br />
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlixXpSazal07Fyb_tWRgNCapV4trOc-cuf5BVaGXAdqYGXKGYcSGHprVVORzRhrMHsggtH94D1BQroVmCc7erndw1EmbWIdR38uP5l-WoAlrHRPM2fNtnDqAeWpOm9sb0i4sNKv4kwpUq/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> USE BD
GO
-- ADICIONA UM CAMPO ID AUTONUMER
ALTER TABLE dbo.tabela
ADD ID INT IDENTITY
GO
-- SELECT
SELECT *
FROM tabela
GO
-- DETECTA DUPLICADOS
SELECT campo, COUNT(*) TotalCount
FROM tabela
GROUP BY campo
HAVING COUNT(*) > 1
ORDER BY COUNT(*) DESC
GO
-- ELEMINA DUPS
DELETE
FROM tabela
WHERE ID NOT IN
(
SELECT MAX(ID)
FROM tabela
GROUP BY campo)
GO
-- SELECT DE CONFIRMAÇÃO
SELECT *
FROM tabela
GO
-- REMOVE INDEX CRIADO PARA REMOVER DUPLICADOS
ALTER TABLE tabela
DROP COLUMN ID
GO
</code></pre>
António Cunha Santoshttp://www.blogger.com/profile/09649579046978437267noreply@blogger.com0tag:blogger.com,1999:blog-627268098360004031.post-29629138135947876102012-12-18T10:57:00.002-08:002012-12-18T11:05:39.535-08:00Revista PROGRAMAR Edição 38 (Dezembro 2012)<br />
<div align="center" style="background-color: white; font-family: 'Trebuchet MS', sans-serif; font-size: 13px; padding: 10px;">
<a href="http://www.portugal-a-programar.pt/revista-programar/edicoes/download.php?e=38&t=site"><img alt="Imagem Colocada" border="0" src="http://www.portugal-a-programar.pt/revista-programar/images/ed38.jpg" style="background-image: none; border: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /></a><br />
<a href="http://www.portugal-a-programar.pt/revista-programar/edicoes/download.php?e=38&t=site">(clica para download)</a></div>
<div style="background-color: white; font-family: 'Trebuchet MS', sans-serif; font-size: 13px; padding: 10px;">
Nesta edição continuaremos também a premiar os autores dos três melhores artigos, dado o sucesso nas edições anteriores. E os leitores devem dar a sua opinião para que possamos premiar correctamente. Para isso vote em <a href="http://tiny.cc/ProgramarED38_V" style="color: #215679;">http://tiny.cc/ProgramarED38_V</a> </div>
<div style="background-color: white; font-family: 'Trebuchet MS', sans-serif; font-size: 13px; padding: 10px;">
Assim nesta edição trazemos até si, como artigo de capa, <strong>um artigo de <strong>Introdução à Programação em <strong>Compute Unified Device Architecture</strong> (CUDA) </strong></strong>de Patricio Domingues. Nesta 38ª edição pode ainda encontrar os seguintes artigos:</div>
<ul style="background-color: white; font-family: 'Trebuchet MS', sans-serif; font-size: 13px;">
<li><strong>Accionamento de Led e Arduino Através de Interface Gráfica em Processing</strong>(Nuno Santos)</li>
<li><strong>PostgreSQL como alternativa de SGBD</strong> (Ricardo Trindade)</li>
<li><strong>Custo Efetivo de uma Solução na Nuvem em Ambiente Windows Azure </strong>(Edgar Santos)</li>
<li><strong>Rápido e bem? A programação web tem!</strong> (Sérgio Laranjeira)</li>
<li><strong>Introdução à Programação em CUDA </strong>(Patrício Domingues)</li>
<li><strong>Visual (NOT) Basic - Organismos! Do zero ao mercado (2/2) </strong>(Sérgio Ribeiro)</li>
<li><strong>Enigmas de C#: Foreach </strong>(Paulo Morgado)</li>
<li><strong>Core Dump: Core Dump [8] - Fora de Horas </strong>(Fernando Martins)</li>
<li><strong><strong>Review do livro </strong>Introdução ao Design de Interfaces </strong>(Sérgio Alves)</li>
<li><strong><strong>Review do livro</strong> Exercícios em Java – Algoritmia e Programação Estruturada</strong>(Carlos José Dias)</li>
<li><strong>Viagem da Informação </strong>(Rita Peres)</li>
<li><strong>“Camaleão! De que cor?” </strong>(Sara Santos)</li>
<li><strong>Verifica regularmente os ficheiros Javascript do seu site? </strong>(David Sopas)</li>
<li><strong>Entrevista a Tiago Andrade e Silva</strong></li>
<li><strong>Projecto em Destaque na Comunidade Portugal-a-Programar: Taggeo</strong></li>
</ul>
Yet Another Stupid Bloghttp://www.blogger.com/profile/15281400804837781865noreply@blogger.com0tag:blogger.com,1999:blog-627268098360004031.post-34225774365994421552012-10-01T03:26:00.006-07:002012-10-01T03:26:59.765-07:00Revista Programar 37º Edição <div class="separator" style="clear: both; text-align: center;">
<a href="http://www.portugal-a-programar.pt/revista-programar/edicoes/download.php?e=37&t=site"><img border="0" height="349" src="http://www.portugal-a-programar.pt/revista-programar/images/ed37.jpg" width="247" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
Nesta edição continuam também a premiar os autores dos três melhores
artigos, dado o sucesso nas edições anteriores. E os leitores devem dar
a sua opinião para que possamos premiar corretamente. Para isso vote
em <a class="bbc_url" href="http://tiny.cc/ProgramarED37_V" rel="nofollow external" title="Link Externo">http://tiny.cc/ProgramarED37_V</a></div>
<div style="text-align: left;">
Assim nesta edição pode-se encontrar, <strong class="bbc">um artigo sobre Makefiles</strong> para conhecer melhor esta poderosa ferramenta e ainda</div>
<ul class="bbc">
<li style="text-align: left;"><strong class="bbc">Interface Gráfica - Termometro Usando Arduino e LM335A</strong> (Nuno Santos)</li>
<li style="text-align: left;"><strong class="bbc">Algoritmos de Path Find : Princípios e Teorias</strong><span style="font-size: 14px;"><strong class="bbc"> </strong>(João Ferreira)</span></li>
<li style="text-align: left;"><span style="font-size: 14px;"><strong class="bbc">SEO: Search Engine Optimization - Introdução Parte III </strong>(Miguel Lobato)</span></li>
<li style="text-align: left;"><strong class="bbc">Profilers Usar ou não usar… Os 5 minutos que mudam a experiência!</strong> (António Cunha Santos)</li>
<li style="text-align: left;"><strong class="bbc">CodeDump -Core Dump [8] - Fora de Horas</strong> (Fernando Martins)</li>
<li style="text-align: left;"><strong class="bbc">Kernel Panic A importância da formação no ensino superior numa carreira dentro da área de segurança informática</strong> (Tiago Henriques)</li>
<li style="text-align: left;"><strong class="bbc">Enigmas do C#: Async/Await e Threads </strong>(Paulo Morgado)</li>
<li style="text-align: left;"><strong class="bbc">Organismos! Do zero ao mercado (1 de 2)</strong> Sérgio Ribeiro<span style="font-size: 14px;">)</span></li>
<li style="text-align: left;"><span style="font-size: 14px;"><strong class="bbc">Review do livro </strong></span><strong class="bbc">HTML5 2ª Edição</strong> (Marco Amado)</li>
<li style="text-align: left;"><span style="font-size: 14px;"><strong class="bbc">Review do livro </strong></span><strong class="bbc">Sistemas Operativos</strong><span style="font-size: 14px;"><strong class="bbc"> </strong>(Fábio Domingos)</span></li>
<li style="text-align: left;"><span style="font-size: 14px;"><strong class="bbc">Review do livro </strong></span>Desenvolvimento em iOS iPhone, iPad, iPod Touch (Sara Santos)</li>
<li style="text-align: left;"><strong class="bbc">Análise: O que faz de nós um bom programador?</strong> (Rita Peres)</li>
<li style="text-align: left;"><strong class="bbc">Falácias da Computação na Nuvem</strong> (Edgar Santos)</li>
<li style="text-align: left;"><strong class="bbc">As reais ameaças de segurança não são os APT</strong> (David Sopas)</li>
<li style="text-align: left;"><strong class="bbc">Entrevista - João Barreto</strong></li>
<li style="text-align: left;"><span style="font-size: 14px;"><strong class="bbc">Projeto em Destaque na Comunidade Portugal-a-Programar: </strong></span><strong class="bbc">NotíciasPT</strong></li>
</ul>
<div style="text-align: left;">
E em parceira com as comunidades <a class="bbc_url" href="http://www.ptcoresec.eu/" rel="nofollow external" title="Link Externo">PtCoreSec</a> e <a class="bbc_url" href="http://netponto.org/" rel="nofollow external" title="Link Externo">Comunidade netPonto</a>:</div>
<ul class="bbc">
<li style="text-align: left;"><strong class="bbc">Introducao-Auditoria-Passwords</strong> (PtCoreSec)</li>
</ul>
<strong class="bbc" style="text-align: left;">BizTalk360 uma ferramenta de suporte e monitorização para a plataforma BizTalk Server </strong><span style="text-align: left;">(NetPonto)</span><br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Mais uma excelente edição, com o excelente trabalho a que me habituou enquanto leitor. Aproveito para agradecer ao pessoal da PtCoreSec, por toda a sua ajuda na revista (vocês sabem quem são). À Ana Barbosa, que mostrou ser a "eficiência em pessoa" (Muito Obrigado), ao Filipe Reis, que tanto tem feito pela nova plataforma. Ao Dr. António Pedro Cunha, que não só escreveu um excelente artigo, como tem sido sempre um apoio presente. Ao Silva (É pá tu és o verdadeiro homem dos 7 oficios). e a toda a restante equipa da Revista PROGRAMAR, que a torna cada vez mais uma leitura mais presente e aprazível. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
Não deixem de ler!</div>
Yet Another Stupid Bloghttp://www.blogger.com/profile/15281400804837781865noreply@blogger.com0tag:blogger.com,1999:blog-627268098360004031.post-88925024469456613262012-05-26T11:59:00.001-07:002014-03-31T05:29:12.684-07:00Nunca se sabe quando pode fazer jeito!<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlixXpSazal07Fyb_tWRgNCapV4trOc-cuf5BVaGXAdqYGXKGYcSGHprVVORzRhrMHsggtH94D1BQroVmCc7erndw1EmbWIdR38uP5l-WoAlrHRPM2fNtnDqAeWpOm9sb0i4sNKv4kwpUq/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> include<stdio.h>
main()
{
int i = 0;
char array[33][4] = {"NUL\0", "SOH\0","ETX\0", "EOT\0", "ENQ\0","ACK\0","BEL\0","BS\0","TAB\0","TAB\0","LF\0","VT\0","FF\0","CR\0","SO\0","SI\0", "DLE\0","DC1\0","DC2\0","DC3\0","DC4\0","NAK\0","SYN\0","ETB\0","CAN\0","EM\0","SUB\0","ESC\0","FS\0","GS\0","RS\0","US\0","Spc\0"};
for (i = 0; i < 33; i++)
{
printf("%d %s\n", i, array[i]);
}
for (i=33;i<256;i++)
{
printf("%d %c\n", i, i);
}
}
</code></pre>
Yet Another Stupid Bloghttp://www.blogger.com/profile/15281400804837781865noreply@blogger.com0tag:blogger.com,1999:blog-627268098360004031.post-40765686271294188252011-07-08T08:49:00.000-07:002014-03-31T06:40:54.951-07:00Snippet de Codigo VB.NET pra criar directoriosAqui fica um exemplo de codigo de como criar directorios numerados sequencialmente em vb.net.<br />
<br />
Fiz isto porque precisei de criar 140 directorios numerados de uma só vez, e não estava com pachorra de criar um a um.<br />
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlixXpSazal07Fyb_tWRgNCapV4trOc-cuf5BVaGXAdqYGXKGYcSGHprVVORzRhrMHsggtH94D1BQroVmCc7erndw1EmbWIdR38uP5l-WoAlrHRPM2fNtnDqAeWpOm9sb0i4sNKv4kwpUq/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> Imports System.IO
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim contador As Integer
Dim max As Integer
Dim dir As String
Dim dir2 As String dir = "c:\meudirectorio\" max = TextBox1.Text
Try
For contador = 1 To max dir2 = dir & contador Directory.CreateDirectory(dir2)
Next contador
Catch End
Try MsgBox("Pronto")
End Sub End Class
</code></pre>
<br />
<br />
Na textbox1 é definido o numero do ultimo directório a ser criado.<br />
<br />
Até uma proximaYet Another Stupid Bloghttp://www.blogger.com/profile/15281400804837781865noreply@blogger.com0tag:blogger.com,1999:blog-627268098360004031.post-28609939466458710832011-06-05T12:08:00.000-07:002012-09-12T14:31:17.850-07:00Portugal a Progamar<div style="text-align: left;">
<a href="http://www.portugal-a-programar.org/forum/index.php">Portugal a Programar</a></div>
<br />
Em dia de calma, escrevo estas breves linhas! :)<br />
<br />
Quem não se recorda dos tempos do Spectrum, dos primeiros PC's dos "tempos em que se programava por prazer, porque era útil, porque era "porreiro", porque se "amava" o que se fazia"?<br />
<br />
Eu faz já alguns anos que me registei numa comunidade de Programadores Portugeses, onde muito li, algo partilhei, muito foi partilhado, na qual me orgulho de participar! Entre outras coisas porque se escreve e lê Português!<br />
<br />
Quem acompanha ou lê este blog, e os meus caros formandos e colegas, que o lêem estão habituados a que publique sobre a revista Programar, tão agradada de todos nós. Quem não está habituado aqui fica o link, para a comunidade.<br />
<br />
Visite, participe, questione! ;)<br />
<br />
<div style="text-align: center;">
<a href="http://www.portugal-a-programar.org/forum/index.php">Portugal a Programar</a><br />
<br />
<div style="text-align: left;">
Vá vai ver que não custa nada! ;)</div>
</div>
Yet Another Stupid Bloghttp://www.blogger.com/profile/15281400804837781865noreply@blogger.com0tag:blogger.com,1999:blog-627268098360004031.post-71076940204124546082010-12-13T11:52:00.000-08:002012-09-12T14:31:36.828-07:00ComunidadeBoa tarde,<br />
<div>
<br /></div>
<div>
Depois de tanto tempo sem cá publicar nada, agora publico o link, para uma revista em formato electrónico que leio regularmente e me tem cativado a atenção pela excelente qualidade dos conteúdos.</div>
<div>
<br /></div>
<div>
<a href="http://www.revista-programar.info/">http://www.revista-programar.info/</a></div>
<div>
<br /></div>
<div>
<br /></div>
Yet Another Stupid Bloghttp://www.blogger.com/profile/15281400804837781865noreply@blogger.com0tag:blogger.com,1999:blog-627268098360004031.post-40285114642277399702010-11-16T11:56:00.000-08:002010-11-16T12:00:33.783-08:00Hoje ao fim de tanto tempo lembrei-me de publicar algo na net, que já fiz à bastante tempo, mas que agora partilho.<div><br /></div><div>Um script para registry do Windows que desabilita os dispositivos de armazenamento em massa USB, mais conhecidos como pen-drives.<div><pre class="brush: ; ruler: true"><br />Windows Registry Editor Version 5.00<br /><br />[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR]<br />"Type"=dword:00000001<br />"Start"=dword:00000004<br />"ErrorControl"=dword:00000001<br />"ImagePath"=hex(2):73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\<br />52,00,49,00,56,00,45,00,52,00,53,00,5c,00,55,00,53,00,42,00,53,00,54,00,4f,\<br />00,52,00,2e,00,53,00,59,00,53,00,00,00<br />"DisplayName"="Controlador de armazenamento de massa USB"<br /><br />[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Security]<br />"Security"=hex:01,00,14,80,90,00,00,00,9c,00,00,00,14,00,00,00,30,00,00,00,02,\<br />00,1c,00,01,00,00,00,02,80,14,00,ff,01,0f,00,01,01,00,00,00,00,00,01,00,00,\<br />00,00,02,00,60,00,04,00,00,00,00,00,14,00,fd,01,02,00,01,01,00,00,00,00,00,\<br />05,12,00,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,\<br />20,02,00,00,00,00,14,00,8d,01,02,00,01,01,00,00,00,00,00,05,0b,00,00,00,00,\<br />00,18,00,fd,01,02,00,01,02,00,00,00,00,00,05,20,00,00,00,23,02,00,00,01,01,\<br />00,00,00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00<br /><br />[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Enum]<br />"Count"=dword:00000000<br />"NextInstance"=dword:00000000<br /><br /></pre>E agora o script para reabilitar os dispositivos:</div><div><br /></div><div><pre class="brush: ; ruler: true">Windows Registry Editor Version 5.00<br /><br />[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR]<br />"Type"=dword:00000001<br />"Start"=dword:00000003<br />"ErrorControl"=dword:00000001<br />"ImagePath"=hex(2):73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\<br /> 52,00,49,00,56,00,45,00,52,00,53,00,5c,00,55,00,53,00,42,00,53,00,54,00,4f,\<br /> 00,52,00,2e,00,53,00,59,00,53,00,00,00<br />"DisplayName"="Controlador de armazenamento de massa USB"<br /><br />[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Security]<br />"Security"=hex:01,00,14,80,90,00,00,00,9c,00,00,00,14,00,00,00,30,00,00,00,02,\<br /> 00,1c,00,01,00,00,00,02,80,14,00,ff,01,0f,00,01,01,00,00,00,00,00,01,00,00,\<br /> 00,00,02,00,60,00,04,00,00,00,00,00,14,00,fd,01,02,00,01,01,00,00,00,00,00,\<br /> 05,12,00,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,\<br /> 20,02,00,00,00,00,14,00,8d,01,02,00,01,01,00,00,00,00,00,05,0b,00,00,00,00,\<br /> 00,18,00,fd,01,02,00,01,02,00,00,00,00,00,05,20,00,00,00,23,02,00,00,01,01,\<br /> 00,00,00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00<br /><br />[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Enum]<br />"Count"=dword:00000000<br />"NextInstance"=dword:00000000<br /><br /></pre><br /><br /></div></div>Yet Another Stupid Bloghttp://www.blogger.com/profile/15281400804837781865noreply@blogger.com0tag:blogger.com,1999:blog-627268098360004031.post-31124793739608564692009-12-10T09:59:00.000-08:002009-12-10T10:00:36.349-08:00RemodelaçõesHoje a conselho de um amigo e depois de algum esforço, o blog foi remodelado de forma a incluir o sintaxhighlighter. Deu um bocadito de trabalho para se modificar tanta coisa, mas parece ter valido a pena o efeitoYet Another Stupid Bloghttp://www.blogger.com/profile/15281400804837781865noreply@blogger.com0tag:blogger.com,1999:blog-627268098360004031.post-74577830441085866292009-10-24T13:08:00.000-07:002014-03-31T06:34:58.480-07:00iTextSharp em Visual Basic Dot net<xml> <w:worddocument> <w:view></w:view><w:trackmoves><w:trackformatting><w:punctuationkerning><w:validateagainstschemas><w:donotpromoteqf><w:compatibility><w:breakwrappedtables><w:snaptogridincell><w:wraptextwithpunct><w:useasianbreakrules><w:dontgrowautofit><w:splitpgbreakandparamark><w:dontvertaligncellwithsp><w:dontbreakconstrainedforcedtables><br /><w:dontvertalignintxbx><w:word11kerningpairs><w:cachedcolbalance></w:cachedcolbalance><m:mathpr><m:mathfont val="Cambria Math"><m:brkbin val="before"><m:brkbinsub val="--"><m:smallfrac val="off"><m:dispdef><m:lmargin val="0"><m:rmargin val="0"><m:defjc val="centerGroup"><m:wrapindent val="1440"><m:intlim val="subSup"><m:narylim val="undOvr"></m:narylim></m:intlim></m:wrapindent><!--[endif]--><!--[if gte mso 9]><xml> <w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"> <w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"> <w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"> <w:lsdexception locked="false" priority="39" name="toc 1"> <w:lsdexception locked="false" priority="39" name="toc 2"> <w:lsdexception locked="false" priority="39" name="toc 3"> <w:lsdexception locked="false" priority="39" name="toc 4"> <w:lsdexception locked="false" priority="39" name="toc 5"> <w:lsdexception locked="false" priority="39" name="toc 6"> <w:lsdexception locked="false" priority="39" name="toc 7"> <w:lsdexception locked="false" priority="39" name="toc 8"> <w:lsdexception locked="false" priority="39" name="toc 9"> <w:lsdexception locked="false" priority="35" qformat="true" name="caption"> <w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"> <w:lsdexception locked="false" priority="1" name="Default Paragraph Font"> <w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"> <w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"> <w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"> <w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"> <w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"> <w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"> <w:lsdexception locked="false" unhidewhenused="false" name="Revision"> <w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"> <w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"> <w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"> <w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"> <w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"> <w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"> <w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"> <w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"> <w:lsdexception locked="false" priority="37" name="Bibliography"> <w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"> </w:LatentStyles> </xml><![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin-top:0cm; margin-right:0cm; margin-bottom:10.0pt; margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Calibri; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Calibri; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;} .MsoPapDefault {mso-style-type:export-only; margin-bottom:10.0pt; line-height:115%;} @page Section1 {size:612.0pt 792.0pt; margin:70.85pt 3.0cm 70.85pt 3.0cm; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} </style> </m:defjc></m:rmargin></m:lmargin></m:dispdef></m:smallfrac></m:brkbinsub></m:brkbin></m:mathfont></m:mathpr></w:word11kerningpairs></w:dontvertalignintxbx></w:dontbreakconstrainedforcedtables></w:dontvertaligncellwithsp></w:splitpgbreakandparamark></w:dontgrowautofit></w:useasianbreakrules></w:wraptextwithpunct></w:snaptogridincell></w:breakwrappedtables></w:compatibility></w:donotpromoteqf></w:validateagainstschemas></w:punctuationkerning></w:trackformatting></w:trackmoves></w:worddocument></xml><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Tabela normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin;} </style> <![endif]--> <br />
<div class="MsoNormal">
Recentemente utilizei um componente gratuito em Visual Basic Dot Net que me pareceu digno de ser dado a conhecer. Trata-se do iTextSharp. Esta simples biblioteca permite muito mais do que o nome sugere. Além de permitir gerar ficheiros Portable Document Format a partir de programas feitos em Visual Basic Dot Net.</div>
<div class="MsoNormal">
Existem bons exemplos feitos em C#, e alguns em VB, mas são muito poucos. Gerar PDF’s a partir de VB sem recurso a ferramentas proprietárias não é complicado, desde que se conheçam os componentes correctos e se lhes dê uso. </div>
<div class="MsoNormal">
O código que abaixo apresento gera um documento pdf e foi colocado num botão, para simplificar as coisas. Existem formas de fazer Reports, assinar digitalmente documentos, cifrar documentos, entre outras coisas com o iTextSharp. Eu apenas me concentrei em fazer um exemplo o mais simples possível. O limite é virtualmente a imaginação do programador.</div>
<div class="MsoNormal">
<xml> <w:worddocument> <w:view></w:view><w:trackmoves><w:trackformatting><w:punctuationkerning><w:validateagainstschemas><w:donotpromoteqf><w:lidthemecomplexscript></w:lidthemecomplexscript> <w:compatibility><w:breakwrappedtables><w:snaptogridincell><w:wraptextwithpunct><w:useasianbreakrules><w:dontgrowautofit><w:splitpgbreakandparamark><w:dontvertaligncellwithsp><w:dontbreakconstrainedforcedtables><w:dontvertalignintxbx><w:word11kerningpairs><w:cachedcolbalance></w:cachedcolbalance><m:mathpr><m:mathfont val="Cambria Math"><m:brkbin val="before"><m:brkbinsub val="--"><m:smallfrac val="off"><m:dispdef><m:lmargin val="0"><m:rmargin val="0"><m:defjc val="centerGroup"><m:wrapindent val="1440"><m:intlim val="subSup"><m:narylim val="undOvr"></m:narylim></m:intlim></m:wrapindent><!--[endif]--><!--[if gte mso 9]><xml> <w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"> <w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"> <w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"> <w:lsdexception locked="false" priority="39" name="toc 1"> <w:lsdexception locked="false" priority="39" name="toc 2"> <w:lsdexception locked="false" priority="39" name="toc 3"> <w:lsdexception locked="false" priority="39" name="toc 4"> <w:lsdexception locked="false" priority="39" name="toc 5"> <w:lsdexception locked="false" priority="39" name="toc 6"> <w:lsdexception locked="false" priority="39" name="toc 7"> <w:lsdexception locked="false" priority="39" name="toc 8"> <w:lsdexception locked="false" priority="39" name="toc 9"> <w:lsdexception locked="false" priority="35" qformat="true" name="caption"> <w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"> <w:lsdexception locked="false" priority="1" name="Default Paragraph Font"> <w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"> <w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"> <w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"> <w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"> <w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"> <w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"> <w:lsdexception locked="false" unhidewhenused="false" name="Revision"> <w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"> <w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"> <w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"> <w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"> <w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"> <w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"> <w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"> <w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"> <w:lsdexception locked="false" priority="37" name="Bibliography"> <w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"> </w:LatentStyles> </xml><![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin-top:0cm; margin-right:0cm; margin-bottom:10.0pt; margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Calibri; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Calibri; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;} .MsoPapDefault {mso-style-type:export-only; margin-bottom:10.0pt; line-height:115%;} @page Section1 {size:612.0pt 792.0pt; margin:70.85pt 3.0cm 70.85pt 3.0cm; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} </style> </m:defjc></m:rmargin></m:lmargin></m:dispdef></m:smallfrac></m:brkbinsub></m:brkbin></m:mathfont></m:mathpr></w:word11kerningpairs></w:dontvertalignintxbx></w:dontbreakconstrainedforcedtables></w:dontvertaligncellwithsp></w:splitpgbreakandparamark></w:dontgrowautofit></w:useasianbreakrules></w:wraptextwithpunct></w:snaptogridincell></w:breakwrappedtables></w:compatibility></w:donotpromoteqf></w:validateagainstschemas></w:punctuationkerning></w:trackformatting></w:trackmoves></w:worddocument></xml></div>
<br />
<div class="MsoNormal">
Inicialmente indico ao VB que vou precisar dos seguintes componentes:</div>
<br />
<script class="brush:vbnet" type="syntaxhighlighter"><![CDATA[
Imports iTextSharp
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.text.xml
Imports System.IO
]]></script>
<br />
<br />
Nem todos os programadores escrevem bem Português! Mas isso não faz deles menores.<br />
Agora num botão normal coloco o código que vai gerar o ficheiro .pdf em c:\ , o documento é formatado em A4, com margens, e apenas inclui alguns parágrafos e pedaços de código não formatados. Penso que para iniciar será melhor assim.<br />
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlixXpSazal07Fyb_tWRgNCapV4trOc-cuf5BVaGXAdqYGXKGYcSGHprVVORzRhrMHsggtH94D1BQroVmCc7erndw1EmbWIdR38uP5l-WoAlrHRPM2fNtnDqAeWpOm9sb0i4sNKv4kwpUq/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Cria uma class de objectos Documento e define o formato de página (A4), a margem esquerda, direita, superior e inferior
Dim doc As New Document(iTextSharp.text.PageSize.A4, 10, 10, 42, 35)
Try
Dim wri As PdfWriter = PdfWriter.GetInstance(doc, New FileStream("c:\PAP.pdf", FileMode.Create))
'Abre o documento para Escrita
doc.Open()
'Escreve algum conteudo no documento
Dim paragraph As New Paragraph("Esta é a Primeira linha do primeiro paragrafo deste exemplo.")
Dim pharse As New Phrase("Esta é a segunda linha usando uma fraze.")
Dim chunk As New Chunk(" Esta é a terceira linha usando um Chunk (pedaço desformatado).")
Dim blankline As New Paragraph(" ")
' Agora adiciona o texto criado acima utilizadno diferentes objectos de class para o documento pdf
doc.Add(paragraph)
doc.Add(pharse)
doc.Add(chunk)
doc.Add(blankline)
Catch dex As DocumentException
'Trata das excepções de Documento
Catch ioex As IOException
'Trada das excepções de input/output
Catch ex As Exception
'trata das restantes excepções
Finally
'fecha o documento
doc.Close()
End Try
End Sub
End Class
</code></pre>
<br />
<br />
Acima deixo um exemplo basico de algo que eu pesquisei e não encontrei, dedicado a quem precisar e agora encontre. Porque partilhar Código e Know-How é mais do que uma simples "politica", é disponibilizar aos outros o que gostariamos que nos disponibilizassem a nós!<br />
<br />
Se por algum acaso achares este How-To inutil, diz! Manda um mail! Diz o quão inutil ele é! Pois para um "Blog Estipido (Yet Another Stupid Blog)" é mesmo disto que ele precisa!Yet Another Stupid Bloghttp://www.blogger.com/profile/15281400804837781865noreply@blogger.com0tag:blogger.com,1999:blog-627268098360004031.post-44663739900345389972009-10-18T15:01:00.000-07:002012-09-12T14:37:39.191-07:003DES VB Dot NETHoje escrevo um pedaço de codigo (duas funções) para utilização de Triple DES em VB Dot NET, pois passei algumas horas na net em busca de um exemplo de como fazer isto e não encontrei nada! :(
<br />
<script type="syntaxhighlighter" class="brush:vbnet"><![CDATA[
Public Function DecryptString(ByVal EncryptedString As String,
ByVal EncryptionKey As String) As String
Try
Dim Deskey() As Byte = {}
Dim inputByteArray(EncryptedString.Length) As Byte
If EncryptionKey.Length = 0 Then
Return "Erro - Falta a Chave"
Else
Deskey = System.Text.Encoding.UTF8.GetBytes(EncryptionKey.Substring(0, 24))
End If
Dim CSPSym As New TripleDESCryptoServiceProvider
inputByteArray = Convert.FromBase64String(EncryptedString)
Dim DecryptMemoryStream As New MemoryStream
Dim DecryptCryptoStream As New
CryptoStream(DecryptMemoryStream, CSPSym.CreateDecryptor(Deskey,
myDESIV), CryptoStreamMode.Write)
DecryptCryptoStream.Write(inputByteArray, 0, inputByteArray.Length)
DecryptCryptoStream.FlushFinalBlock()
Catch exCryptoError As Exception
Return exCryptoError.Message
End Try
Return ""
End Function
Private Function EncryptString(ByVal PlainTextString As String, ByVal EncryptionKey As String) As String
Dim DESKey() As Byte = {}
Try
If EncryptionKey.Length = 0 Then
Return "Erro - Falta chave de Encriptacao"
Else
DESKey = System.Text.Encoding.UTF8.GetBytes(EncryptionKey.Substring(0, 24))
End If
Dim CSPSym As New TripleDESCryptoServiceProvider
Dim inputByteArray() As Byte = System.Text.Encoding.UTF8.GetBytes(PlainTextString)
Dim EncryptMemoryStream As New MemoryStream
Dim EncryptCryptoStream As New CryptoStream(EncryptMemoryStream, CSPSym.CreateEncryptor(DESKey, myDESIV), CryptoStreamMode.Write)
EncryptCryptoStream.Write(inputByteArray, 0, inputByteArray.Length)
EncryptCryptoStream.FlushFinalBlock()
Return Convert.ToBase64String(EncryptMemoryStream.ToArray())
Catch exCryptoError As Exception
Return exCryptoError.Message
End Try
End Function
Private codificakey ( )
Dim Secretkey As String = "*896&*(%HUYFteu27^5452ewe"
Dim EncryptedPassword As String = EncryptString(Password, Secretkey)
Dim valorsenha As String
password = txtSenha.Text
password = EncryptString(password, Secretkey)
valorsenha = password
MsgBox(valorsenha)
End sub
]]></script>
<br />
Espero que isto seja util para alguém ;) Afinal de contas TripleDES ainda é das formas seguras de guardar dados ;)<br />
<br />
Dedicado a uma Anjo Tigre que me serviu de inspiração! 88 teclas, 9 anos, 7 dias e muita paciencia... para me servir de inspiração ainda nos dias que correm!Yet Another Stupid Bloghttp://www.blogger.com/profile/15281400804837781865noreply@blogger.com2tag:blogger.com,1999:blog-627268098360004031.post-15351567216208995862009-10-01T07:30:00.000-07:002009-10-01T07:42:29.280-07:00Recuperar uma BD de ACCESS MDBDesta vez o How-to, vai ser sobre um "truque" já antigo mas ainda muito util: Como recuperar uma Base de dados em formato .MDB que tenha ficado ligeiramente corrompida:<br /><br /><span style="font-weight: bold;">1-</span> <span style="font-style: italic;">Fazer uma cópia de segurança da base de dados</span> (Italico porque muita gente não o faz, salta este paço importantissimo)<br /><br /><span style="font-weight: bold;">2-</span> Abrir o <span style="font-weight: bold;">Painel de Controlo</span> no <span style="font-weight: bold;">Menu iniciar</span> do Microsoft Windows<br /><span style="font-weight: bold;">3-</span> Duplo click no icon <span style="font-weight: bold;">Ferramentas administrativas</span><br /><br /><span style="font-weight: bold;">4-</span> Dentro das ferramentas Administrativas Duplo-Click em <span style="font-weight: bold;">Origem de dados (ODBC)</span><br /><span style="font-weight: bold;">5-</span> Abrir o Separador <span style="font-weight: bold;">DSN de Sistema</span><br /><br /><span style="font-weight: bold;">6-</span> Clicar no Botão <span style="font-weight: bold;">Configurar</span><br /><br /><span style="font-weight: bold;">7-</span> Clicar no botão <span style="font-weight: bold;">Reparar<br /><br />8- </span>Navegar até ao ficheiro de base de dados que pertendemos reparar e seleciona-lo<br /><br /><span style="font-weight: bold;">9-</span> Clicar no botão <span style="font-weight: bold;">OK<br /><br />10- </span>Deve aparecer uma <span style="font-weight: bold;">caixa de mensagem</span> com a informação de que a base de dados foi reparada com sucesso. Assim a base de dados estará pronta a ser utilizara<span style="font-weight: bold;"><br /><br /></span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAIg5FuYGM10341IjphJeUbVwjCgYFaiFWZuVIRVHI8joAWTaO5iAap3vHfY54_5ESs5nOfJpfz5CJ3iCSnL6jRSBAxMUB7_SjN-6WZSxwVY3IDfbTLDPK52BrOvBE3M44vcJgLyPck0TA/s1600-h/repararbdmdb2.jpg"><img style="cursor: pointer; width: 320px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAIg5FuYGM10341IjphJeUbVwjCgYFaiFWZuVIRVHI8joAWTaO5iAap3vHfY54_5ESs5nOfJpfz5CJ3iCSnL6jRSBAxMUB7_SjN-6WZSxwVY3IDfbTLDPK52BrOvBE3M44vcJgLyPck0TA/s320/repararbdmdb2.jpg" alt="" id="BLOGGER_PHOTO_ID_5387641665049164850" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjEh1XEG4lIbIvWWEwRkwI0wBT9jzRWka-Uu35tEoH281RI4xsERb5SiZtMrpcKYchoPXarmlXYIzxqQy2RhzhxLkeqqdvfCxgUncnL2ZA_6M4oAAFTF-jvrRulV6QATV6RhJOQ4da6Moy/s1600-h/repararbdmdb.jpg"><img style="cursor: pointer; width: 320px; height: 204px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjEh1XEG4lIbIvWWEwRkwI0wBT9jzRWka-Uu35tEoH281RI4xsERb5SiZtMrpcKYchoPXarmlXYIzxqQy2RhzhxLkeqqdvfCxgUncnL2ZA_6M4oAAFTF-jvrRulV6QATV6RhJOQ4da6Moy/s320/repararbdmdb.jpg" alt="" id="BLOGGER_PHOTO_ID_5387641658635017538" border="0" /></a><br /><br />Boa utilização!<br /><br />(Conhecimento é puder, use-o com sabedoria)<br /><span style="font-weight: bold;"><br /></span><span style="font-weight: bold;"></span>Yet Another Stupid Bloghttp://www.blogger.com/profile/15281400804837781865noreply@blogger.com1tag:blogger.com,1999:blog-627268098360004031.post-91678000507386305552009-09-24T00:58:00.000-07:002009-09-24T05:36:24.602-07:00Fazer o Windows Ver uma PEN/Unidade Flash como um disco local<div style="FONT-WEIGHT: bold; TEXT-ALIGN: center"> </div>Como fazer o Windows detectar memória flash como se fosse um disco rígido (testado<br />em XP e Vista)<br /><br /><span style="FONT-WEIGHT: bold">Teoria:</span> O Windows detecta as unidades usb como sendo unidades amovíveis, o truque<br />é fazer com que o Sistema Operativo (Windows) veja determinada pen (Marca e modelo<br />expecifico) como sendo um disco rígido, cada vez que a unidade seja ligada numa porta<br />USB da maquina onde o driver foi instalado<br /><br />Pré-Requisitos:<br />· Dirver <a href="http://www.mediafire.com/?oqlgdvcymzz">USB_Local_Disk</a><br />· <a href="http://sourceforge.net/projects/notepad-plus/files/notepad%2B%2B%20releases%20binary/npp%205.5%20bin/npp.5.5.Installer.exe/download">Notepad ++</a> ou outro editor ASCII<br /><br />Como fazer o Windows detectar a memória flash como um disco:<br /><br /><span style="FONT-WEIGHT: bold">1. </span>Numa maquina Windows liga a pen na porta USB<br /><span style="FONT-WEIGHT: bold"><br />2. </span>Partindo do pressuposto que usas notepad++ não precisas de o sacar, se não usas Google e saca!<br /><span style="FONT-WEIGHT: bold"><br />3.</span> Copia o ficheiro USB_Localdisk.zip para o teu ambiente de trabalho e descompacta-o<br /><span style="FONT-WEIGHT: bold"><br />4.</span> Abre com o notepad++ o ficheiro cfadisk.inf que está na pasta onde acabaste de descomprimir o zip<br /><br /><span style="FONT-WEIGHT: bold">5. </span>Vai até à linha 26 do ficheiro cfadisk.inf . Aqui selecionas o texto Nome_da_instancia_da_pen. E deixa o file aberto<br /><span style="FONT-WEIGHT: bold"><br />6.</span> Apartir do Windows segue os seguintes paços Iniciar-> Executar e digita devmgmt.msc depois clica Ok<br /><span style="FONT-WEIGHT: bold"><br />7. </span>Em Unidades de disco, faz duplo click na tua unidade "USB Flash":<br /><span style="FONT-WEIGHT: bold"><br />8.</span> Na janela de Propriedades clica em Detalhes. Seleciona o texto em ID de Instancia de Dispositivo e faz crtl+c<br /><br /><span style="FONT-WEIGHT: bold">9. </span>Agora na selecção que fizeste antes, na linha 26 faz ctrl+v Grava e feixa<br /><br /><span style="FONT-WEIGHT: bold">10.</span> Clicka no Iniciar-> Executar e digita devmgmt.msc clicak Ok voltas ao gestor de dispositivos.<br /><span style="FONT-WEIGHT: bold"><br />11.</span> Em Unidades de Disco, vai até à pen click-direito e seleciona a opção Actualizar Controlador:<br /><span style="FONT-WEIGHT: bold"><br />12.</span> Escolhe Não<br /><span style="FONT-WEIGHT: bold"><br />13. </span>Seguinte e Instalar apartir de uma lista ou localização especifica<br /><span style="FONT-WEIGHT: bold"><br />14.</span> Seguint, escolhe Não eu escolherei o controlador a instalar<br /><span style="FONT-WEIGHT: bold"><br />15.</span> Escolhe Disco e vai até onde gravaste a pasta que descomprimiste e o ficheiro que modificas-te (USB_LocalDisk) . Seleciona cfadisk.inf clica Open e OK<br /><span style="FONT-WEIGHT: bold"><br />16.</span> Vais receber os avisos idiotas do Windows sobre o Driver (Manda pastar)<br /><span style="FONT-WEIGHT: bold"><br />17.</span> Pronto a bombar (Deves ver a pen como se fosse um disco local! Copia para lá os files .mdf e .ldf e faz o atach no SQL Studio<br /><br />Notas: Sempre que quizeres utilizar um dispositivo de marca ou modelo diferente para<br />este efeito basta seguires estes paços (uma vez para cada marca e modelo)<br /><br />P.S.: Se gostas-te do How-to pensa que alguém teve de tomar muito Cafézinho para o escrever!Yet Another Stupid Bloghttp://www.blogger.com/profile/15281400804837781865noreply@blogger.com0tag:blogger.com,1999:blog-627268098360004031.post-75737147574966364852009-09-24T00:57:00.000-07:002009-09-24T00:58:53.194-07:00YASBComo ideia surgida durante a passada madruga hoje, inicia-se o YASB (Yet Another Stupid Blog) Apenas Mais um Blog Estupido!<br /><br />Vamos ver quanto tempo irá durar, e esperar que os how-to's que vão ser disponibilizados sejam uteis!Yet Another Stupid Bloghttp://www.blogger.com/profile/15281400804837781865noreply@blogger.com0