29/7/14

PsExec de PsTools

Psexec

PsExec.exe \\nombreEquipo -i -d -s "c:\windows\notepad.
exe"
-i para que salga en la pantalla (en alguna prueba con
    el notepad salio todo la ventana negra, problemas de repintado)
-d para que no se quede la línea de comandos pillada hasta que se 
    acabe el proceso. Lo lanza, devuelve el promp y un número de
    proceso que usamos para matarlo luego.
-s Usa la cuenta del sistema para lanzar la aplicación. Soluciona
    el problema de que no se vea la ventana
La aplicación saca algo como esto

c:\windows\notepad.exe started on nombreEquipo with process ID 7452.
Y lo matamos remotamente (el usuario podría cerrarlo) con:

C:\Users\icrufra\Desktop\PSTools>pskill.exe \\nombreEquipo 7452
Si se quiere entrar en la máquina remota con otro usuario se pondría –u (usuario@dominio) y el programa pide la clave.

15/7/14

Crear un acceso directo (Link) desde C#

(Con .net 4)
Type ShellType = Type.GetTypeFromProgID("WScript.Shell");
dynamic Shell = Activator.CreateInstance(ShellType);
dynamic shortcut = Shell.CreateShortcut(@"c:\borrame.lnk");
shortcut.TargetPath = @"c:\Windows\Notepad.exe";
shortcut.WorkingDirectory = @"c:\Windows";
shortcut.Save();
(Esto es antiguo con .net 4 usar el anterior)
Basado en:
http://www.codeproject.com/Articles/3905/Creating-Shell-Links-Shortcuts-in-NET-Programs-Usi
Por debajo usa Windows Scripting Host con lo que hay que importar un com (ocx) para que funcione. Es un poco chapuza pero es lo que hay.
En el proyecto se añade la referencia a ese com:
  1. En el proyecto,
  2. añadir referencia,
  3. de tipo com,
  4. el nombre es: “Windows Script Host Object Model”
Desde ese momento deja hacer un:
using IWshRuntimeLibrary;
El código que crea un link al notepad en el escritorio sería:

var shell = new WshShell();
IWshShortcut  link = (IWshShortcut)shell.CreateShortcut((Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),"borrame.lnk")));
link.TargetPath = @"c:\windows\notepad.exe";
link.Save();

6/3/14

Obtener información de catálogo de Base de datos Access

DataTable t = Ctx.con.GetSchema(OleDbMetaDataCollectionNames.Columns);
StringBuilder sb = new StringBuilder();
foreach(DataRow r in t.Rows){
 foreach(DataColumn c in t.Columns){
  sb.Append(String.Format("{0}: {1}||",c.ColumnName,r[c.ColumnName]));
 }
 sb.AppendLine();
}
Clipboard.SetText(sb.ToString());
MessageBox.Show(sb.ToString());
DataRow []dr = t.Select("TABLE_NAME = 'AnoActual' and COLUMN_NAME = 'Ano'");
MessageBox.Show(dr[0]["TABLE_NAME"].ToString() + dr[0]["COLUMN_NAME"].ToString());

29/1/14

Salto de página en html

@media all {
   div.saltopagina{
      display: none;
   }
}
@media print{
   div.saltopagina{
      display:block;
      page-break-before:always;
   }
}
<div class="saltopagina"><div>

17/1/14

Compilar proyecto desde línea de comandos

msbuild UILog1.csproj /p:Configuration=Release /t:Clean
El msbuild está en:
C:\Windows\Microsoft.NET\Framework\v4.0.30319
Este ejemplo borraría la versión release. Sin el /t:Clean la crearía. También funciona con soluciones. Y es compatible con SharpDevelop.

14/1/14

Nlog a fichero por mes

Crearía un log a un fichero. Cada mes crea un fichero nuevo. El fichero está, en principio, en la misma carpeta que el ejecutable.
NLog.Targets.FileTarget ft = new NLog.Targets.FileTarget();
ft.FileName ="FicheroDeLog.txt";
ft.ArchiveEvery = FileArchivePeriod.Month;
NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(ft, LogLevel.Trace);
LogManager.Configuration.AddTarget("File",ft);
Logger logger = LogManager.GetCurrentClassLogger();

9/7/13

Recabar información del equipo en windows

WMI: Windows Management Instrumentation http://msdn.microsoft.com/en-us/library/windows/desktop/aa394586(v=vs.85).aspx
static void MostrarTodo(StringBuilder sb, string cad){
 ObjectQuery query = new ObjectQuery("Select * from " + cad);
 XmlOpen(sb,1,cad);
 ManagementObjectSearcher mos = new ManagementObjectSearcher(query);
 if(mos!=null){
  ManagementObjectCollection moc = mos.Get();
  if(moc != null){
   foreach (ManagementObject mo in moc) {
    PropertyDataCollection pdc = mo.Properties;
    if(pdc != null){
     foreach (PropertyData pd in pdc) {
      AppendProperty(sb, pd);
     }
    }else{
     sb.AppendLine("");
    }
   }
  }else{
   sb.AppendLine("");
  }
 }else{
  sb.AppendLine("");
 }
 XmlClose(sb,1,cad);
}
Se le llamaría con:
MostrarTodo(sb, "Win32_Desktop");
MostrarTodo(sb, "Win32_DesktopMonitor");
MostrarTodo(sb, "Win32_OperatingSystem");
MostrarTodo(sb, "Win32_StartupCommand");

   
MostrarTodo(sb, "Win32_LogicalDisk");
MostrarTodo(sb, "Win32_MappedLogicalDisk");
MostrarTodo(sb, "Win32_DiskDrive");

MostrarTodo(sb, "Win32_NetworkAdapter");
MostrarTodo(sb, "Win32_NetworkAdapterConfiguration");

12/6/12

Generación de Codigo en C#

Nota: Está el código en hithub https://github.com/IvanCruzFraguela/EjemploGeneracionCodigo

usings necesarios:


using System.CodeDom;
using System.CodeDom.Compiler;
Suponemos que hay 2 controles de Tipo TextBox llamados:
tbFuenteGenerado
tbErrores
la función que genera los objectos necesarios para definir el código a generar como ejemplo es:
private CodeCompileUnit GeneraCodigo(){
 //Unidad de Compilación (ensamblado)
 var cu = new CodeCompileUnit();
 cu.ReferencedAssemblies.Add("System.dll");//Ensamblados que enlaza (aunque este debería estar por defecto)
 //Espacio de nombres
 var n = new CodeNamespace("EjemploGeneracionCodigo1");
 cu.Namespaces.Add(n);
 n.Imports.Add(new CodeNamespaceImport("System"));//Espacios de nombres que utiliza este namespace para compilar
 //Clase
 var c = new CodeTypeDeclaration("ClaseGenerada");
 n.Types.Add(c);
 c.BaseTypes.Add(new CodeTypeReference(typeof(System.Timers.Timer)));//Su clase padre
 c.IsPartial = true;
 
 //Atributo de la clase
 CodeMemberField mf = new CodeMemberField(typeof(string),"_atributo");
 c.Members.Add(mf);
 //Propiedad de la clase
 CodeMemberProperty cp = new CodeMemberProperty();
 c.Members.Add(cp);
 cp.Attributes = MemberAttributes.Public | MemberAttributes.Final;//lo de Final para que no sea virtual (por defecto si es público es virtual)
 cp.Type = new CodeTypeReference(typeof(string));
 cp.Name = "atributo";
 CodeFieldReferenceExpression cfre = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "_atributo"); 
 CodeMethodReturnStatement mrs = new CodeMethodReturnStatement(cfre);
 cp.GetStatements.Add(mrs);
 //Metodo de la clase
 CodeMemberMethod cmm = new CodeMemberMethod();
 c.Members.Add(cmm);
 cmm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
 cmm.Name = "Metodo1";
 cmm.ReturnType = new CodeTypeReference(typeof(int));
 CodeParameterDeclarationExpression pde = new CodeParameterDeclarationExpression(typeof(int),"enteroDeEntrada");
 cmm.Parameters.Add(pde);
 pde = new CodeParameterDeclarationExpression(typeof(string),"cadenaDeEntrada");
 cmm.Parameters.Add(pde);
 //Declaración de variable
 CodeVariableDeclarationStatement vds = new CodeVariableDeclarationStatement(typeof(string),"aux",new CodePrimitiveExpression("Prueba1") );
 cmm.Statements.Add(vds);
 //Llamar a método arbitrario
  //variable a llamar y método
  CodeMethodReferenceExpression  ctr = new CodeMethodReferenceExpression(new CodeVariableReferenceExpression("Console"),"WriteLine");
  //Llamada en sí con sus parámetros
  CodeMethodInvokeExpression invoke1 = new CodeMethodInvokeExpression( ctr, new CodeExpression[] {new CodePrimitiveExpression("Hola mundo")} );
 cmm.Statements.Add(invoke1);
  
 
 //Código a pelo. Ojo no se puede generar, por ejemplo, un foreach.
 cmm.Statements.Add(new CodeSnippetStatement("foreach(string s in cadenas){"));
 cmm.Statements.Add(new CodeSnippetStatement("Console.WriteLine(s);"));
 cmm.Statements.Add(new CodeSnippetStatement("}"));
 mrs = new CodeMethodReturnStatement(new CodePrimitiveExpression(42));
 cmm.Statements.Add(mrs);
                          
 return cu;
}
el código para generar el fuente e incluso compilarlo desde aquí es:
 CodeCompileUnit cu = GeneraCodigo();
 CodeDomProvider dp = CodeDomProvider.CreateProvider("CSharp");
 //Imprimir el código
 StringWriter sw = new StringWriter();
 System.CodeDom.Compiler.IndentedTextWriter itw = new IndentedTextWriter(sw);
 CodeGeneratorOptions go = new CodeGeneratorOptions();
 go.BlankLinesBetweenMembers = false;
 dp.GenerateCodeFromCompileUnit(cu,sw,go);
 this.tbFuenteGenerado.Text = sw.ToString();
 
 //Compilar desde dom
 CompilerParameters cp = new CompilerParameters(new string[]{},"borrame.dll");
 CompilerResults cr = dp.CompileAssemblyFromDom(cp,cu);
 tbErrores.Text = "";
 foreach(CompilerError ce in cr.Errors){
  tbErrores.Text += String.Format("{0}){1} in {2} at line {3} column {4} isWarning{5}",ce.ErrorNumber,ce.ErrorText,ce.FileName,ce.Line,ce.Column,ce.IsWarning);
 }

En teoría se podría generar tanto VB con C# pero supongo que con el uso se abusará de CodeSnippetStatement (“pon esto y no preguntes”) dado que hay construcciones importantes de C# (foreach, using) que no se pueden generar como tal con lo que solo se podrá generar C#.
Referencias:

25/4/12

Rebol: Grabar lista de objetos y recuperarla

REBOL[title: "Grabar y recuperar lista de objetos"]

obj1: make object![
 id: 1
 nomb: "Uno"
]

obj2: make object![
 id: 2
 nomb: "Dos"
]

lObj: copy []

append/only :lObj to-block obj1 ; only para que inserte como bloque y to-block para que haga un bloque del objeto.
        ; no mola nada esta forma de hacer las cosas
        ; ¿Qué diferencia hay entre un bloque y un objeto en realidad?
append/only :lObj to-block obj2

print mold lObj ; para ver lo que rebol grabaría

fich: %ListaObjectos.r 

save :fich :lObj

listaRecuperada: load :fich

print :listaRecuperada/1 ; imprimir primer elemento
print :listaRecuperada/2

Mercurial

* hg init <--Para crear el repositorio. Se ejecuta en el directorio a controlar.
* hg add <-- Para añadir la primera vez.
* hg ci -u ivancruz <-- Para hacer un commit
* hg log <-- Para ver las versiones
* hg update  <-- Para volver a una versión anterior

12/9/11

Compilando desde bajada de svn

svn co svn://desarrollo.dxx.xudicial.xunta.es/repositorio/csharp/InventarioDHCP_1.10
svn co svn://desarrollo.dxx.xudicial.xunta.es/repositorio/csharp/Util

cd InventarioDHCP_1.10
c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild /p:Configuration=Release
Baja el código a donde se encuentre el fichero .bat y lo compila.

24/5/11

Envío de teclas a aplicaciones (para pruebas automáticas)

Uno de los problemas se produce cuando se muestra un MessageBox. No hay manera de cerrarlo así que: a enviar teclas.

// Código para enviar las pulsaciones de teclas
Microsoft.VisualBasic.Interaction.AppActivate(f.Text);//Activa la aplicación. f es el formulario creado anteriormente para pruebas
f.Focus();// Hace falta también esto por lo visto.
Util.EnviarTeclas(5000, "{TAB}");//Cuadro de diálogo. Pasar a "no"
Util.EnviarTeclas(6000, "{ENTER}");//Cuadro de diálogo. ENTER.

// Código en Utils
    public static void EnviarTeclas(int TiempoEspera, string teclas) {
      Thread t = new Thread(new ParameterizedThreadStart(AEjecutarPorEnvioTeclas));
      EnvioTeclas et = new EnvioTeclas(TiempoEspera,teclas);
      t.Start(et);

    }
    public static void AEjecutarPorEnvioTeclas(Object EnvTecl) {
      EnvioTeclas aux = EnvTecl as EnvioTeclas;
      Thread.Sleep(aux.espera);
      SendKeys.SendWait(aux.teclas);
    }
  public class EnvioTeclas {
    public int espera;
    public string teclas;
    public EnvioTeclas(int espera, string teclas) {
      this.espera = espera;
      this.teclas = teclas;
    }
  }

16/5/11

Crear filas de prueba

A destacar el tema de que hay que crear una tabla para incluir la fila en ella.

private static DS.AGPROVRow _ProvRow;
public static DS.AGPROVRow ProvRow {
get {
if (_ProvRow == null) {
DS.AGPROVDataTable aux = new DS.AGPROVDataTable();
_ProvRow = aux.NewAGPROVRow();
_ProvRow.ID = 99;
_ProvRow.NOMB = "Prueba Grabar 1";
}
return _ProvRow;
}
}

27/4/11

Comparar el contenido de dos filas

public static bool ContenidoRowsEsIgual<T>(T row1, T row2) where T : DataRow {
bool result = true;
if (!row1.GetType().Equals(row2.GetType())) {
throw new Exception("Las filas no son del mismo tipo");
}
DataRow r1 = row1 as DataRow;
DataRow r2 = row2 as DataRow;
for (int i = 0; i < r1.ItemArray.Length; i++) {
if (!r1[i].Equals(r2[i])) {
result = false;
}
}
return result;
}

24/11/10

Mostrar Fechas en Oracle

Mostrar fecha y hora
to_char(campo_fecha,'DD/MM/YYYY HH24:MI:SS')

Para probarlo:
select to_char(sysdate,'DD/MM/YYYY HH24:MI:SS') from dual;


Más información en:
http://www.oradev.com/oracle_date_format.jsp

12/11/10

Roles de un usuario de windows

Adaptado de código de Jose Manuel Alarcón.

de la página: http://www.netveloper.com/2004/12/c%C3%B3mo-obtener-los-roles-a-los-que-pertenece-un-usuario-de-windows/

Me falló como a Javier Carrillo y lo solucioné con:


using System;
using System.Collections;
using System.Security.Principal;
using System.Reflection;
using System.IO;
public
class Prueba
{
public static void Main()
{
StreamWriter sw = File.CreateText("roles.txt");
foreach (IdentityReference Role in WindowsIdentity.GetCurrent().Groups.Translate(typeof(NTAccount)))
{
Console.WriteLine(Role.Value);
sw.WriteLine(Role.Value);
}
Console.ReadLine();
sw.Close();
}
}

27/7/10

Añadir consultas a un DataAdapter por código

El problema es que si se hace gráficamente, al rehacer el DataSet, se borran.
Para solucionarlo hay que heredar del DataAdapter generado y crear los Fill que se quieran.

public class AdapterModificado : DSTableAdapters.EnteTableAdapter
{
public void FillByNif(DS.EnteDataTable t,string nif)
{
SqlCeCommand aux = this.CommandCollection[0];
this.CommandCollection[0] = new SqlCeCommand("select * from ente where nif = @nif");
this.CommandCollection[0].Connection = this.Connection;
this.CommandCollection[0].Parameters.Add("@nif", nif);
this.Fill(t);
this.CommandCollection[0] = aux;
}
}

13/4/10

Usar servicios Web desde C# cómodamente

Se usa
wsdl.exe

Se encuentra por ejemplo en:
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin

Hay que estar en la carpeta correspondiente y desde línea de comandos usar
wsdl [URL servicio]

genera un fichero de c# (por defecto) con el que poder llamar a los métodos web
Ejemplo:
wsdl http://localhost/Service1.asmx


Para usarlo:

serv = new Service1();
serv.Url = @"http://localhost/Service1.asmx";
serv.CookieContainer = new System.Net.CookieContainer();

serv.MetodoWeb("Dato para método",5); // El fichero generado tiene los métodos web como métodos normales del objeto

Sql Server desde línea de comandos (sqlcmd)

Se usa
sqlcmd

Está en
C:\Program Files\Microsoft SQL Server\100\Tools\Binn

Las mayúsculas y minúsculas son importantes (curioso en Windows)

sqlcmd -S [nombre instancia servidor] -d [nombre bd] -i [fichero a ejecutar]

ejemplo

sqlcmd -S localhost\SQLExpress -d PruebaBD1 -i creacion_tablas.sql