Posts
345
Comments
105
Trackbacks
4
Wednesday, June 23, 2010
Constructor via Reflection kopieren

Kann man vielleicht mal wieder brauchen: Constructor via Reflection kopieren

//copy constructor

public ClassName(Testclass testclass)

{

FieldInfo[] lFields = this.GetType().GetFields(BindingFlags.NonPublic

            | BindingFlags.Public | BindingFlags.Instance);

 

foreach (FieldInfo fi in lFields)

            fi.SetValue(this, fi.GetValue(testclass));

}

posted @ Wednesday, June 23, 2010 6:53 AM | Feedback (0)
Wednesday, May 12, 2010
SharePoint: Branding und CSS des Menüs der „Site Actions“

Im Rahmen eines Redesigns einer SharePoint Anwendung musste ich auch das Layout des Site Actions Menüs anpassen.

Wie sollte ich herausfinden welche CSS-Klassen für dieses Menü verantwortlich sind?

Nachdem ich mit der Standardseite zu Sharepoint und CSS (CSS Reference Chart for SharePoint 2007) http://www.heathersolomon.com/content/sp07cssreference.htm nicht weiter kam und mir die Entwicklertools des Internet Explorers auch nicht weiterhalfen, versuchte ich mein Glück mit Firefox und dem Add-on „Firebug“.

Damit konnte ich schnell die Klasse „ms-MenuUIPopupBody“ identifizieren. Ein Blick in die Datei core.css zeigte anschließend, dass die Klassen welche mit „.ms-Menu*“ beginnen für das Menü der „Site Actions“ verwendet werden.

Rahmen:
.ms-MenuUIPopupBody
{
   border:1px solid #e6e6e7;
   margin:0px;
   padding:0px;
}

Überschrift der Beschreibung:
.ms-MenuUIPopupBody TABLE
{
   color:#003399;
   font-size:100%;
   margin:0px;
   padding:0px;
}

Text der Beschreibung:
.ms-menuitemdescription
{
   color:#58585a;
}

Hover-Effekt:
.ms-MenuUIItemTableHover
{
   background-color:#ffe6a0;
   border:1px solid #d2b47a;
}

Die anderen Styles für das Menü der Site Actions beginnen alle mit „.ms-Menu*“ over-Effect und können in der Datei core.css gefunden werden.

posted @ Wednesday, May 12, 2010 6:45 AM | Feedback (0)
Wednesday, April 28, 2010
Tastenkombinationen für Internet Explorer 8

Eine Übersicht über die Tastenkombinationen für Internet Explorer 8 findet man hier:

http://windows.microsoft.com/de-DE/windows-vista/Internet-Explorer-8-keyboard-shortcuts

posted @ Wednesday, April 28, 2010 9:46 AM | Feedback (0)
Friday, April 16, 2010
Überblick über die verschiedenen MasterPages in SharePoint

In SharePoint werden vier verschiedene MasterPages verwendet:

Die originalen MasterPages liegen Im Verzeichnis:

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\GLOBAL

- default.master
- mwsdefault.master

Die Datei default.master wird für alle Standardseiten verwendet.
Die Datei mwsdefault.master wird für alle Meeting Templates verwendet.

Eine weitere wichtige MasterPage liegt im Verzeichnis:

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\LAYOUTS

- application.master

Diese ist die MasterPage für alle Seiten welche die Setting-Seiten betreffen.

Die 4. MasterPage liegt im Verzeichnis:

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\ADMIN

- admin.master

Diese MasterPage wird für das Layout der Seiten der Zentral Administration verwendet.

posted @ Friday, April 16, 2010 2:41 PM | Feedback (0)
Wednesday, March 10, 2010
SharePoint Manager

Ein praktisches Tool für SharePoint ist der SharePoint Manager welches bei CodePlex zu finden ist: http://spm.codeplex.com/

Hiermit kann man sich alle Properties aller sites eine lokalen Serverfarm ansehen(und ändern).

posted @ Wednesday, March 10, 2010 2:00 PM | Feedback (0)
Thursday, March 04, 2010
Tools für das Testen eine Mail-Servers

Neulich musste ich mal wieder einen Mailserver einrichten und durchtesten, dabei fand ich  folgende Seiten und Tools hilfreich:

Anleitung für das testen eines Mailservers mit Telnet:
http://www.outlook-net.de/7-16.htm

Seite welche einen Mailserver auf ein offenes Relay testet:
http://www.abuse.net/relay.html

SMTP-Explorer ist ein sehr gutes Programm für das testen eines Mailservers, welches viel Tipparbeit abnimmt:

Bild2

posted @ Thursday, March 04, 2010 10:42 AM | Feedback (0)
Friday, February 26, 2010
Kopierbefehl für “CurrentLibs”

In Projekten empfiehlt es sich oft die erstellen DLLs in ein gemeinsames Verzeichnis zu kopieren, welches auch anderen Anwendungen zu Verfügung steht.

Hier für’s Archiv der Post-build event Command line Kopierbefehl für Visual Studio:

xcopy /y /d "$(TargetPath)" "$(SolutionDir)\..\CurrentLibs\"

posted @ Friday, February 26, 2010 2:04 PM | Feedback (0)
Wednesday, February 10, 2010
Validierung von Telerik RadComboBoxen

Standardmäßig ist es umständlich eine Telerik RadComboBox zu validieren, da diese nicht als klassische ASP.NET Dropdownliste sondern als Input-Feld mit dazu passenden Layern gerendert wird.

Hier ein Beispiel wie man eine Telerik RadComboBox clientseitig per Javascript validieren kann:

Zunächst  die Telerik RadComboBox mit einem klassischen CustomValidator:

<telerik:RadComboBox ID="ddlAnrede"
    runat="server" Skin="Telerik" Width="200px"
    DataTextField="Value"
    DataValueField="Key"
    OnClientBlur="validateCombo"
    SelectedValue='<%# Bind("Anrede") %>'>
    <Items>
        <telerik:RadComboBoxItem TextBitte wählen” Value="" runat="server" />                                               
        <telerik:RadComboBoxItem Text="Herr" Value="Herr" runat="server" />
        <telerik:RadComboBoxItem Text="Frau" Value="Frau" runat="server" />
    </Items>
</telerik:RadComboBox>
<span style='color:Red'>
    <asp:CustomValidator ID="CustomValidator2"
       style='visibility:hidden'
       runat="server"
       ErrorMessage="&nbsp;*"
       validationgroup="insert"
       ClientValidationFunction="validateComboBox" >
    </asp:CustomValidator>
</span>

Diese RadCombobox wird mittels der Javascript-Funktion “validateComboBox” validiert:

<script type="text/javascript">
    function validateComboBox(source, args) {
        args.IsValid = false;
        var combo = $find('<%= getClientID("ddlAnrede") %>');
        var value = combo.get_value();
        var spanErrorAnrede = document.getElementById('<%= getClientID("CustomValidator1") %>');
        if (value.length == 0) {
            spanErrorAnrede.style.visibility = 'visible';
            args.IsValid = false;
        }
        else {
            spanErrorAnrede.style.visibility = 'hidden';
            args.IsValid = true;
        }
    }
</script>
 

 
Hat man mehrere RadComboboxen in einem Formular oder befindet sich diese in einem Listview – und die ID lässt ich nicht mittels der Methode getClientID ermitteln - dann kann man folgende Javascript-Funktion für die Validierung verrwenden:

 <telerik:RadCodeBlock ID="RadCodeBlock789" runat="server">
    <script type="text/javascript">

        function Validate(source, clientside_argument) {
            var sourceElement = document.getElementById(source.id);
            var comboInput = document.getElementByI(sourceElement.controltovalidate + "_Input");
            if (clientside_argument.Value == "--- Bitte wählen ---") {
                comboInput.style.background = "red";
                clientside_argument.IsValid = false;
            }
            else {
                comboInput.style.background = "";
                clientside_argument.IsValid = true;
            }
        }
    </script>
</telerik:RadCodeBlock>
posted @ Wednesday, February 10, 2010 1:56 PM | Feedback (0)
Friday, January 15, 2010
Dynamic Dummy Image Generator

Vor kurzem gefunden, eine Webseite welche einfache Dummy-Grafiken erstellt.

http://dummyimage.com/240x180, z.B. erstellt folgende Grafik:

240x180

posted @ Friday, January 15, 2010 4:01 PM | Feedback (0)
Monday, January 11, 2010
Generische Methode FindControlRecursive

Fürs Archiv eine generische Methode FindControlRecursive:

public static T FindControlRecursive<T>(Control parent, string id) where T : class
{
   foreach (Control child in parent.Controls)
   {
      if ((child.ID != null)
         && string.Equals(child.ID, id, StringComparison.InvariantCultureIgnoreCase)
         && (child is T))
         return (child as T);
 
      var ctl = FindControlRecursive<T>(child, id);
      if (ctl != null)
         return ctl;
   }
   return null;
}
posted @ Monday, January 11, 2010 1:26 PM | Feedback (0)
Wednesday, January 06, 2010
Bilderpfad in web.config / appSettings

Damit ich mir das nicht mehr raussuchen hier eine Anleitung wie man eine Bilderpfad in der web.config speichert und in den ImageUrl-Parameter eines aspx:image-Tags einfügt:

Eintrag in der web.config:

<configuration>
 <appSettings >
    <addkey="ImagePath"value="~/Images/" />
 </appSettings>
</configuration>


Eine allgemeine Methode zu auslesen der appSettings:

public static string GetAppSettings(string keyname)
{
    string keyVal = ConfigurationManager.AppSettings.Get(keyname);
    if (keyVal == null)
       throw new System.Exception("AppSettings key '" + keyname + "' not exist.");
 
   return keyVal;
}


Pfad in das aspx:image-Tag einfügen:

<asp:Image ID="Image2" runat="server" Width="120px" Height="130px"
    ImageUrl='<%# this.GetImagePath(Eval("Bild")) %>' />

 
Die Methode “GetImagePath” in der codebehind-Datei:

protected string GetImagePath(object picture)
{
   return Utils.GetAppSettings("ImagePath",true) + picture;
}
posted @ Wednesday, January 06, 2010 3:22 PM | Feedback (0)
Friday, December 18, 2009
Praktisches Tool: Bildschirmlupe
OneLoupe OneLoupe wird benötigt, um alles, was auf dem Bildschirm angezeigt wird, beliebig zu vergrößern und gegebenenfalls auch festzuhalten, um es nachträglich unter die Lupe zu nehmen.

Dieses Freeware-Tool kann hier heruntergeladen werden:
http://www.softwareok.de/?seite=Microsoft/OneLoupe

posted @ Friday, December 18, 2009 2:58 PM | Feedback (0)
Wednesday, December 16, 2009
Methode für den Vergleich zweier Objekte

Hier eine kleine Methode, mit welcher sich 2 Objekte miteinander vergleichen lassen:

public static bool CompareObjectValues<T>(T obj1, T obj2) where T : class
{
   if (obj1.GetType() != obj2.GetType())
      throw new ArgumentException("ungleiche Klassen können nicht verglichen werden");

   FieldInfo[] lFields = obj1.GetType().GetFields(BindingFlags.NonPublic
      | BindingFlags.Public | BindingFlags.Instance);
 
   foreach (FieldInfo fi in lFields)
   {
      if (Convert.ToString(fi.GetValue(obj1)) != Convert.ToString(fi.GetValue(obj2)))
         return false;
    }
    return true;
 }
posted @ Wednesday, December 16, 2009 2:49 PM | Feedback (1)
Wednesday, December 02, 2009
Installierte Datenbank-Provider

Falls man wissen möchte welche Datenbank-Provider installiert sind, kann man das folgende Konsolenprogramm ausführen:

using System;

using System.Data;

using System.Data.Common;

 

namespace ConsoleApplication1

{

    class Program

    {

        static void Main()

        {

            DataTable dt = DbProviderFactories.GetFactoryClasses();

 

            Console.WriteLine("Installierte Datenbank-Provider:");

            Console.WriteLine();

            foreach (var s in dt.AsEnumerable())

            {

                Console.WriteLine(s[0]);

            }

 

            Console.ReadLine();

        }

    }

}

posted @ Wednesday, December 02, 2009 3:52 PM | Feedback (0)
Monday, November 30, 2009
Fun mit ObjectDataSource

Unlängst erhielt ich in der Entwicklung folgende Fehlermeldung:

“Eine Eigenschaft namens ‘XXX’ für den durch die DataObjectTypeName-Eigenschaft in ObjectDataSource angegebenen Typ "XXX" konnte nicht gefunden werden. “

In unserem Fall lag dies daran, dass die Update-Methode der verwendeten ObjectDataSource eine Liste von Objekten erwartete.
Nachdem wir eine neue Update-Methode erstellt haben die nur ein Objekt erwartet, war die Fehlerursache behoben.

posted @ Monday, November 30, 2009 10:06 AM | Feedback (0)
Thursday, November 26, 2009
Windows Explorer Ersatz: Q-Dir

Q-Dir ist ein kostenloser Ersatz für den Standard Windows Explorer und kann bis zu 4 Fenster mit verschiedenen Laufwerken anzeigen.

qDir 

http://www.softwareok.de/?seite=Freeware/Q-Dir

posted @ Thursday, November 26, 2009 3:01 PM | Feedback (0)
Tuesday, November 17, 2009
“Code analysis tool” von Microsoft: CAT.NET

Microsoft hat unter der folgenden Adresse als CTP-Version ein Tool für die Code-Analyse zur Verfügung gestellt:
http://www.microsoft.com/downloads/details.aspx?FamilyId=0178e2ef-9da8-445e-9348-c93f24cc9f9d&displaylang=en

Dieses Tool überprüft den Quellcode auf mögliche Schwachstellen in Richtung:
- Cross Site Scripting
- SQL Injection
- Process Command Injection
- File Canonicalization
- Exception Information
- LDAP Injection
- XPATH Injection
- Redirection to User Controlled Site

Nach der Installation steht das Tool im Hauptmenü Tools von Visual Studio zur Verfügung.

Hier ein kleines ASP.NET Quellcode-Beispiel:

<%@ Page Language="C#" ValidateRequest="false" %>

 

<script runat="server">  

    protected void Button1_Click(object sender, EventArgs e)

    {

        string eingabe = TextBox1.Text;

        Label1.Text = eingabe;

    }

</script>

 

<html>

<head id="Head1" runat="server">

    <title>Untitled Page</title>

</head>

<body>

    <form id="Form1" runat="server">

    <div>

        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

        <asp:Button ID="Button1" runat="server" Text="speichern"

            onclick="Button1_Click" />

        <br />

        <asp:Label runat="server" id="Label1"></asp:Label>

    </div>

    </form>

</body>

</html>

 

Eine Analyse mit CAT.NET bringt das folgende Ergebnis:

Bild2

Dieses weist uns darauf hin, dass die Zeilen:

        string eingabe = TextBox1.Text;

        Label1.Text = eingabe;

gegen Cross-Site Scripting nicht geschützt ist!

Durch den Einsatz von Anti-XSS Libary lassen sich dann solche Lücken schliessen.

posted @ Tuesday, November 17, 2009 7:47 AM | Feedback (2)
Thursday, October 15, 2009
Kann man immer wieder mal gebrauchen

Ein kleines Konsolenprogramm welches die Verzeichnisse des lokalen Benutzers ausgibt:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; 

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (Environment.SpecialFolder sp in Enum.GetValues(typeof(Environment.SpecialFolder)))
            {
                Console.WriteLine(sp.ToString());
                Console.WriteLine(Environment.GetFolderPath(sp));
                Console.WriteLine();
            }

            Console.ReadLine();
        }
    }
}

Die Ausgabe ist die folgende:

Desktop
C:\Users\admin\Desktop

Programs
C:\Users\admin\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

Personal
C:\Users\admin\Documents

Personal
C:\Users\admin\Documents

Favorites
C:\Users\admin\Favorites

Startup
C:\Users\admin\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

Recent
C:\Users\admin\AppData\Roaming\Microsoft\Windows\Recent

SendTo
C:\Users\admin\AppData\Roaming\Microsoft\Windows\SendTo

StartMenu
C:\Users\admin\AppData\Roaming\Microsoft\Windows\Start Menu

MyMusic
C:\Users\admin\Music

DesktopDirectory
C:\Users\admin\Desktop

MyComputer

Templates
C:\Users\admin\AppData\Roaming\Microsoft\Windows\Templates

ApplicationData
C:\Users\admin\AppData\Roaming

LocalApplicationData
C:\Users\admin\AppData\Local

InternetCache
C:\Users\admin\AppData\Local\Microsoft\Windows\Temporary Internet Files

Cookies
C:\Users\admin\AppData\Roaming\Microsoft\Windows\Cookies

History
C:\Users\admin\AppData\Local\Microsoft\Windows\History

CommonApplicationData
C:\ProgramData

System
C:\Windows\system32

ProgramFiles
C:\Program Files

MyPictures
C:\Users\admin\Pictures

CommonProgramFiles
C:\Program Files\Common Files

posted @ Thursday, October 15, 2009 6:07 PM | Feedback (0)
Friday, October 02, 2009
Über eine Enumeration iterieren

Falls ich das mal wieder brauche, Beispiel wie man über eine Enumeration iteriert:

class Program
{  
   public
enum
farben
   {
      rot,
      blau,
      gruen
   }
  

   static void Main(string[] args)
   {
   
      foreach (farben farbe in Enum.GetValues(typeof(farben)))
      {
        
Console
.WriteLine(farbe.ToString());
      }
      Console
.ReadLine();
   }
}

posted @ Friday, October 02, 2009 5:55 PM | Feedback (0)
Thursday, October 01, 2009
Tools und Erweiterungen für Visual Studio

findet man hier: http://visualstudiogallery.msdn.microsoft.com/en-us/

posted @ Thursday, October 01, 2009 2:09 PM | Feedback (0)
Wednesday, September 16, 2009
Checkliste für sichere ASP.Net-Webseiten

Bei Microsoft findet man unter der folgenden Adresse eine Checkliste für sicherere ASP-Net-Webanwendungen:
http://msdn.microsoft.com/de-de/library/cc431349(classic).aspx

posted @ Wednesday, September 16, 2009 8:49 AM | Feedback (0)
Thursday, September 10, 2009
Anti-Cross Site Scripting Library von Microsoft

Von Microsoft gibt es eine Anti-Cross Site Scripting Library derzeit in der Version 3.1. Diese kann man unter der folgenden Adresse herunterladen:
http://www.microsoft.com/downloads/details.aspx?familyid=051EE83C-5CCF-48ED-8463-02F56A6BFC09&displaylang=en

Die DLL-Datei “AntiXSSLibrary.dll” muss man in den bin-Ordner des ASP.NET Projektes legen und schon hat man die Methoden der Anti-Cross Site Scripting Library zur Verfügung.

Unter dem Namespace Microsoft.Security.Application kann man auf die AntiXss Klasse und deren Methoden zugreifen.

Die Methode Server.HtmlEncode encodiert nur die Zeichen < > “ und &. Die Library AntiXss dagegen stellt für das Encodieren mehrere und speziellere Methoden zur Verfügung:

HtmlAttributeEncode()
HtmlEncode()
JavaScriptEncode()
UrlEncode()
VisualBasicScriptEncode()
XmlAttributeEncode()
XmlEncode()

Hier ein einfaches Beispiel:

<%@ Page Language="C#" ValidateRequest="false" %>

<script runat="server">

 

    protected void Button1_Click(object sender, EventArgs e)

    {

        string eingabe = Microsoft.Security.Application.AntiXss.HtmlEncode(TextBox1.Text);

        Label1.Text = eingabe;

    }

</script>

 

<html>

<head runat="server">

    <title>Untitled Page</title>

</head>

<body>

    <form id="Form1" runat="server">

    <div>

        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

        <asp:Button ID="Button1" runat="server" Text="speichern"

            onclick="Button1_Click" />

        <br />

        <asp:Label runat="server" id="Label1"></asp:Label>

    </div>

    </form>

</body>

</html>


Beispiele der Encodierung:

<script>alert(‘hallo’);</script>

  • wird mit HtmlEncode() zu:
    ”&#60;script&#62;alert&#40;&#8216;hallo&#8217;&#41;&#59;&#60;&#47;script&#62;”
  • dagegen mit JavaScriptEncode() zu:
    ”'\x3cscript\x3ealert\x28\u2018hallo\u2019\x29\x3b\x3c\x2fscript\x3e'”
posted @ Thursday, September 10, 2009 4:39 PM | Feedback (0)
Thursday, August 27, 2009
Konsolenfenster anpassen

Wer viel mit Konsolenfenstern arbeitet, den stört vielleicht die Standardgröße und die Standardfarben (weiss auf schwarz) dieses Fensters.

Diese Parameter kann man über den Menüpunkt Eigenschaften im Konsolenfenster ändern oder aber direkt im Quellcode:

Console.BackgroundColor = ConsoleColor.Gray;
Console.ForegroundColor = ConsoleColor
.Black;
Console
.WindowHeight = 50;
Console.Clear();

posted @ Thursday, August 27, 2009 8:03 AM | Feedback (0)
Thursday, August 13, 2009
Kleine Funktion für die Ermittlung der aktuellen Kalenderwoche

Fürs Archiv eine kleine Funktion welche die aktuelle Kalenderwoche zurückgibt:

int NumberOfWeek()
{
    
CultureInfo myCultureInfo = new CultureInfo("de-DE"
);
     Calendar
myCalendar = myCultureInfo.Calendar;

     CalendarWeekRule
myWeeekRule = myCultureInfo.DateTimeFormat.CalendarWeekRule;
     DayOfWeek
myFirstDayOfWeek = myCultureInfo.DateTimeFormat.FirstDayOfWeek;

     return myCalendar.GetWeekOfYear(DateTime
.Now, myWeeekRule, myFirstDayOfWeek);
}

posted @ Thursday, August 13, 2009 12:33 PM | Feedback (0)
Tuesday, August 04, 2009
Beispiel für eine Google-Abfrage

Hier ein kleines Beispiel für eine automatisierte Abfrage bei Google. Dieses kleine Konsolenprogramm liest einen Suchbegriff ein und gibt danach die ersten 10 Treffer bei Google aus:

using System;

using System.Collections.Generic;

using System.Net;

using System.Text;

 

namespace GoogleAbfragen

{

    class Program

    {

        static List<string> webPages = new List<string>();

 

        static void Main()

        {

            Console.WriteLine("Bitte den Suchbegriff eingeben: ");

            string suchbegriff = Console.ReadLine();

            GetGoogleResults(suchbegriff);

            Console.WriteLine();

            Console.WriteLine("Folgende Seiten wurden gefunden:");

            foreach (string page in webPages)

            {

                Console.WriteLine(page);

            }

            Console.ReadLine();

        }

 

        public static void GetGoogleResults(string searchItem)

        {

            // Google Searchstring zusammenbauen

            StringBuilder googleSearchString = new StringBuilder(searchItem);

            googleSearchString.Replace(" ", "+");

            googleSearchString.Insert(0, "http://www.google.com/search?hl=en&lr=&ie=UTF-8&oe=UTF-8&q=");

 

            // die Google-Seite einlesen

            WebClient client = new WebClient();

            byte[] result = client.DownloadData(googleSearchString.ToString());

            string googleReturnPage = Encoding.ASCII.GetString(result);

           

            int startPoint = 1;

            int endPoint = 1;

            const string newLinkStartFlag = "<h3 class=r><a href=\"";

            const string newLinkEndFlag = "\" class=l";

 

            // nur die ersten 10 Treffer einlesen

            for (int i = 0; i < 10; i++)

            {

                startPoint = googleReturnPage.IndexOf(newLinkStartFlag, startPoint);

                endPoint = googleReturnPage.IndexOf(newLinkEndFlag, startPoint);

 

                string page = googleReturnPage.Substring(startPoint + newLinkStartFlag.Length,

                                endPoint - (startPoint + newLinkStartFlag.Length));

                webPages.Add(page);

 

                startPoint = endPoint;

             }

        }

    }

}

 

posted @ Tuesday, August 04, 2009 11:35 AM | Feedback (0)