Enum DescriptionAttribute auslesen

using System;
using System.ComponentModel;
using System.Reflection;

/// <summary->
/// freeware helper class for getting enum descriptions
/// (W) 2011 by admin of codezentrale.6x.to
/// </summary->
public static class EnumDescriptor
{
    /// <summary->
    /// get enum attribute description
    /// </summary->
    /// <param name=&quot;val&quot;->current enum</param->
    /// <returns->returns enum attribute description</returns->
    public static string GetDescription(Enum val)
    {
        FieldInfo fi = val.GetType().GetField(val.ToString());
        DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

        return (attributes.Length -> 0) ? attributes[0].Description : val.ToString();
    }
}

Benutzername und Benutzerolle ausgeben

using System.Security.Principal;

/// <summary->
/// freeware helper class for getting logon user info
/// (W) 2011 by admin of codezentrale.6x.to
/// </summary->
public static class UserInfo
{
    /// <summary->
    /// get logon user name
    /// </summary->
    public static string LogonUserName
    {
        get
        {
            return WindowsIdentity.GetCurrent().Name;
        }
    }
    /// <summary->
    /// get role of current user
    /// </summary->
    public static string LogonUserRole
    {
        get
        {
            string role = string.Empty;

            WindowsPrincipal principle = new WindowsPrincipal(WindowsIdentity.GetCurrent());

            if (principle.IsInRole(WindowsBuiltInRole.AccountOperator)) role = &quot;account operator&quot;;
            else
                if (principle.IsInRole(WindowsBuiltInRole.Administrator)) role = &quot;administrator&quot;;
                else
                    if (principle.IsInRole(WindowsBuiltInRole.BackupOperator)) role = &quot;backup opearator&quot;;
                    else
                        if (principle.IsInRole(WindowsBuiltInRole.Guest)) role = &quot;guest&quot;;
                        else
                            if (principle.IsInRole(WindowsBuiltInRole.PowerUser)) role = &quot;power user&quot;;
                            else
                                if (principle.IsInRole(WindowsBuiltInRole.User)) role = &quot;user&quot;;
                                else
                                    if (principle.IsInRole(WindowsBuiltInRole.PrintOperator)) role = &quot;print operator&quot;;
                                    else
                                        if (principle.IsInRole(WindowsBuiltInRole.Replicator)) role = &quot;replicator&quot;;
                                        else
                                            if (principle.IsInRole(WindowsBuiltInRole.SystemOperator)) role = &quot;system operator&quot;;

            return role;
        }
    }
}

Manifest in ein Projekt einbinden

Häufig ist es notwendig, dass man einer Anwendung Adminrechte gibt, wenn diese zum Beispiel Netzwerkzugriffe, Registryeingriffe usw. tätigen muss. Dazu muss man eine Anwendungsmanifestdatei in die exe-Datei einkompilieren, in welcher die entsprechenden Benutzerrechte für die Windows-UAC eingetragen sind.

Variante 1:

  1. In Visual Studio 2010 besteht die Möglichkeit eine Manifestdatei erzeugen lassen: im Projekt Rechtsklick auf das Projekt->Hinzufügen->Neues Element …->Anwendungsmanifestdatei. Visual Studio erzeugt unten stehende Datei, wobei die entsprechend benötigten Zeilen aus- bzw. einkommentiert werden müssen:
    <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?->
    <asmv1:assembly manifestVersion=&quot;1.0&quot; xmlns=&quot;urn:schemas-microsoft-com:asm.v1&quot; xmlns:asmv1=&quot;urn:schemas-microsoft-com:asm.v1&quot; xmlns:asmv2=&quot;urn:schemas-microsoft-com:asm.v2&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;->
      <assemblyIdentity version=&quot;1.0.0.0&quot; name=&quot;MyApplication.app&quot;/->
      <trustInfo xmlns=&quot;urn:schemas-microsoft-com:asm.v2&quot;->
        <security->
          <requestedPrivileges xmlns=&quot;urn:schemas-microsoft-com:asm.v3&quot;->
            <!-- UAC-Manifestoptionen
              Wenn Sie die Zugangsebene für das Windows-Benutzerkonto ändern möchten, ersetzen Sie den 
              requestedExecutionLevel-Knoten durch eines der folgenden Elemente.
    
            <requestedExecutionLevel  level=&quot;asInvoker&quot; uiAccess=&quot;false&quot; /->
            <requestedExecutionLevel  level=&quot;requireAdministrator&quot; uiAccess=&quot;false&quot; /->
            <requestedExecutionLevel  level=&quot;highestAvailable&quot; uiAccess=&quot;false&quot; /->
    
                Durch Angeben des requestedExecutionLevel-Knotens wird die Datei- und Registrierungsvirtualisierung deaktiviert.
                Wenn Sie Datei- und Registrierungsvirtualisierung für Abwärts- 
                kompatibilität verwenden möchten, löschen Sie den requestedExecutionLevel-Knoten.
            -->
            <requestedExecutionLevel level=&quot;asInvoker&quot; uiAccess=&quot;false&quot; /->
          </requestedPrivileges->
        </security->
      </trustInfo->
      
      <compatibility xmlns=&quot;urn:schemas-microsoft-com:compatibility.v1&quot;->
        <application->
          <!-- Eine Liste aller Windows-Versionen, mit denen die Anwendung kompatibel ist. Windows wählt automatisch die am stärksten kompatible Umgebung aus.-->
    
          <!-- Wenn die Anwendung mit Windows 7 kompatibel ist, heben Sie die Kommentierung des folgenden supportedOS-Knotens auf.-->
          <!--<supportedOS Id=&quot;{35138b9a-5d96-4fbd-8e2d-a2440225f93a}&quot;/->-->
          
        </application->
      </compatibility->
      
      <!-- Designs für allgemeine Windows-Steuerelemente und -Dialogfelder (Windows XP und höher) aktivieren -->
      <!-- <dependency->
        <dependentAssembly->
          <assemblyIdentity
              type=&quot;win32&quot;
              name=&quot;Microsoft.Windows.Common-Controls&quot;
              version=&quot;6.0.0.0&quot;
              processorArchitecture=&quot;*&quot;
              publicKeyToken=&quot;6595b64144ccf1df&quot;
              language=&quot;*&quot;
            /->
        </dependentAssembly->
      </dependency->-->
    
    </asmv1:assembly->
    
  2. eine Anwendungsmanifestdatei für Windows 7 und mit Zugriffsrechten “Admin” sieht beispielhaft so aus:
    <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?->
    <asmv1:assembly manifestVersion=&quot;1.0&quot; xmlns=&quot;urn:schemas-microsoft-com:asm.v1&quot; xmlns:asmv1=&quot;urn:schemas-microsoft-com:asm.v1&quot; xmlns:asmv2=&quot;urn:schemas-microsoft-com:asm.v2&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;->
      <assemblyIdentity version=&quot;1.0.0.0&quot; name=&quot;MyApplication.app&quot;/->
      <trustInfo xmlns=&quot;urn:schemas-microsoft-com:asm.v2&quot;->
        <security->
          <requestedPrivileges xmlns=&quot;urn:schemas-microsoft-com:asm.v3&quot;->
            <requestedExecutionLevel level=&quot;requireAdministrator&quot; uiAccess=&quot;false&quot; /->
          </requestedPrivileges->
        </security->
      </trustInfo->
      
      <compatibility xmlns=&quot;urn:schemas-microsoft-com:compatibility.v1&quot;->
        <application->
          <supportedOS Id=&quot;{35138b9a-5d96-4fbd-8e2d-a2440225f93a}&quot;/->
        </application->
      </compatibility->
      
      <!-- Designs für allgemeine Windows-Steuerelemente und -Dialogfelder (Windows XP und höher) aktivieren -->
      <!-- <dependency->
        <dependentAssembly->
          <assemblyIdentity
              type=&quot;win32&quot;
              name=&quot;Microsoft.Windows.Common-Controls&quot;
              version=&quot;6.0.0.0&quot;
              processorArchitecture=&quot;*&quot;
              publicKeyToken=&quot;6595b64144ccf1df&quot;
              language=&quot;*&quot;
            /->
        </dependentAssembly->
      </dependency->-->
    
    </asmv1:assembly->
    
  3. Die Manifestdatei muss unter Projektbaum->Eigenschaften->Anwendung->Symbol und Manifest->Manifest (Datei “app.manifest”) ausgewählt sein, damit sie von Visual Studio mit in die Anwendung einkompiliert wird.
  4. Die im Ausgabeverzeichnis fertig kompilierte Anwendung sollte nun ein Security-Schild im Icon haben.
  5. Nach dem Start der Anwendung fragt Windows-UAC nun, ob das Programm mit Adminrechten ausgeführt werden darf.

Variante 2:

  1. Diese manuelle Variante funktioniert nur mit VS Standard oder Professional, nicht mit Express, da bei letzterem keine Post Build Events eingestellt werden können.
  2. Manifestdatei in einem Editor erzeugen, Projektnamen bei “name” korrekt eintragen, Prozessorarchitektur anpassen und im Ausgabeverzeichnis des Projektes speichern. Eine Beispieldatei zum Erlangen von Adminrechten siehe oben unter Punkt 2 bei Varante 1.
  3. Mittels mt.exe wird nun die Manifestdatei in die ausführbare Datei als Win32-Resource eingebunden. Die prinzipielle Kommandozeile dazu lautet:
    mt.exe –manifest temp.manifest –outputresource:YourApp.exe;#1
    

    Dazu unter Projektbaum->Projekt->Eigenschaften->Buildereignisse->Befehlszeile für Postbuild-Ereignis folgende Zeile eintragen:

    "$(DevEnvDir)..\..\SDK\v2.0\bin\mt.exe" -manifest "$(ProjectDir)$(TargetName).exe.manifest"  –outputresource:"$(TargetDir)$(TargetFileName)";#1
    

    bei anderen VS-Versionen alternativ auch:

    "c:\Programme\Microsoft SDKs\Windows\v7.0A\bin\mt.exe" -manifest "$(ProjectDir)$(TargetName).exe.manifest"  –outputresource:"$(TargetDir)$(TargetFileName)";#1
    
  4. Die im Ausgabeverzeichnis fertig kompilierte Anwendung sollte nun ein Security-Schild im Icon haben.
  5. Nach dem Start der Anwendung frag Windows-UAC nun, ob das Programm mit Adminrechten ausgeführt werden darf.

Proxy für WebBrowser setzen

/// <summary->
/// set and enable proxy and port for IE
/// </summary->
public void SetProxy(string proxy, int port)
{
    RegistryKey RegKey = Registry.CurrentUser.OpenSubKey(&quot;Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings&quot;, true);

    // if proxy is not set, disable proxy
    if (string.IsNullOrEmpty(proxy))
    {
        RegKey.SetValue(&quot;ProxyServer&quot;, &quot;&quot;);
        RegKey.SetValue(&quot;ProxyEnable&quot;, 0);
    }
    else
    {
        // otherwise set proxy
        RegKey.SetValue(&quot;ProxyServer&quot;, proxy + &quot;:&quot; + port.ToString());
        RegKey.SetValue(&quot;ProxyEnable&quot;, 1);
    }
}

Weiterführende Links:

Flash and Proxy Support on .NET WebBrowser Controls
MS AIOCF: WebBrowser with proxy

[C#] Assemblyinfo auslesen

using System.IO;
using System.Reflection;

/// <summary>
/// freeware helper class for getting .NET assembly info
/// (W) 2011 by admin of codezentrale.6x.to
/// </summary>
public static class AssemblyInfo
{
    /// <summary>
    /// get assembly title
    /// </summary>
    public static string AssemblyTitle
    {
        get
        {
            object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);

            if (attributes.Length > 0)
            {
                AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];

                if (titleAttribute.Title != string.Empty) return titleAttribute.Title;
            }

            return Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
        }
    }
    /// <summary>
    /// get assembly version
    /// </summary>
    public static string AssemblyVersion
    {
        get
        {
            return Assembly.GetExecutingAssembly().GetName().Version.ToString();
        }
    }
    /// <summary>
    /// get assembly description
    /// </summary>
    public static string AssemblyDescription
    {
        get
        {
            object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);

            if (attributes.Length == 0) return string.Empty;

            return ((AssemblyDescriptionAttribute)attributes[0]).Description;
        }
    }
    /// <summary>
    /// get assembly product
    /// </summary>
    public static string AssemblyProduct
    {
        get
        {
            object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);

            if (attributes.Length == 0) return string.Empty;

            return ((AssemblyProductAttribute)attributes[0]).Product;
        }
    }
    /// <summary>
    /// get assembly copyright
    /// </summary>
    public static string AssemblyCopyright
    {
        get
        {
            object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);

            if (attributes.Length == 0) return string.Empty;

            return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
        }
    }
    /// <summary>
    /// get assembly company
    /// </summary>
    public static string AssemblyCompany
    {
        get
        {
            object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);

            if (attributes.Length == 0) return string.Empty;

            return ((AssemblyCompanyAttribute)attributes[0]).Company;
        }
    }
}

Vergleich zweier Bitmaps

/// <summary>
/// Funktion zum schnellen Vergleich zweier Bitmaps per unsafe-Code
/// im Projekt muss "Erstellen->unsicheren Code zulassen" angewählt sein
/// </summary>
/// <param name="b1"->1. Bitmap</param>
/// <param name="b2"->2. Bitmap</param>
/// <returns>true, wenn gleich, sonst false</returns>
private bool BitmapsAreEqual(Bitmap b1, Bitmap b2)
{
    bool bRetVal = true;

    if ((b1 != null) && (b2 != null))
    {
        BitmapData bmd1 = b1.LockBits(new Rectangle(0, 0, b1.Width, b1.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
        BitmapData bmd2 = b2.LockBits(new Rectangle(0, 0, b2.Width, b2.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);

        int cnt_px = b1.Width * b2.Height;

        unsafe
        {
            byte* p1 = (byte*)bmd1.Scan0;
            byte* p2 = (byte*)bmd2.Scan0;

            for (int i = 0; i < cnt_px; i++)
            {
                if (p1[i] != p2[i])
                {
                    bRetVal = false;
                    break;
                }
            }
        }

        b1.UnlockBits(bmd1);
        b2.UnlockBits(bmd2);
    }
    else
    {
        bRetVal = false;
    }

    return bRetVal;
}