“Nicht identifiziertes Netzwerk. Kein Internetzugriff.” unter Windows 7 lösen

Seit Jahr und Tag ärgere ich mich über die vermeintliche Intelligenz von Windows, beim Herstellen von Netzwerkverbindungen:

“Nicht identifiziertes Netzwerk. Kein Internetzugriff.”

Fuck you!

Nach vielem Suchen und dem Finden von ganz ausgefuchsten Lösungen bin ich nicht weiter gekommen.

+++WERBUNG+++ Professionell eine eigene Website erstellen +++WERBUNG+++

Die (für mich akzeptable) schlichte Brute-Force-Lösung sah dann schließlich so aus:

  1. Dienste-MMC aufmachen (Start -> Ausführen -> “services.msc”).
  2. Den Windows-Firewall-Dienst suchen.
  3. Diesen Dienst stoppen und deaktivieren.

Danach ging es endlich wieder.

Was mir außerdem geholfen hat, war der Tipp in diesem Technet-Artikel:

  1. Open an Administrator: Command Prompt. To do so, click Start, click All Programs, click Accessories, right-click Command Prompt, and then click Run as administrator.
  2. If the User Account Control dialog box appears, confirm that the action it displays is what you want, and then click Continue.
  3. At the command prompt, type the following command:
    netsh advfirewall set profiles state off

    where profiles is AllProfilesCurrentProfileDomainProfilePrivateProfile, or PublicProfile.

Ich habe mir dann konkret mit folgendem geholfen:

netsh advfirewall set AllProfiles state off

Was sogar auch mal geholfen hatte, war im Netzwerk-Center auf das rote X bei der symbolischen Leitung zu klicken und „Reparieren“ zu wählen. Das hatte ewig gedauert und danach hat es tatsächlich funktioniert.

Update 2013-12-06

Heute hatte ich einen Fall mit einem IBM-/Lenovo-Notebook, bei dem ich über WLAN dasselbe Phänomen hatte:

“Nicht identifiziertes Netzwerk. Kein Internetzugriff.”

Nach einer Stunde erfolglosem Try-and-Error habe ich aufgegeben und das Gerät via LAN-Kabel erfolgreich ans Netz bekommen.

Update 2013-12-09

Mein Kollege hatte ein ähnliches Phänomen (via WLAN) und hat es wohl dadurch gelöst, dass er sicher gestellt hat, dass der Gateway und DNS-Server alle im selben Subnetz sind. Dann wurde das Netzwerk automatisch erkannt.

Es war also eine reine IP-Einstellungs-Geschichte bei ihm, ganz ohne Firewall-und-Co.-Magie.

Update 2014-05-15

In einer VMware-Maschine habe ich das ganze gelöst bekommen, indem ich das Netzwerk von „Bridged“ auf „NAT“ umgestellt habe (in den Einstellungen der virtuellen Maschine).

Update 2014-08-15

In meiner VMware-Maschine wollte ich unbedingt wieder „Bridged“ haben. Ich habe lange gesucht und probiert, und die Lösung war letztendlich, beim „Bridged to“ von „Automatic“ auf meinen tatsächlichen LAN-Adapter umzustellen:

vmware-virtual-network-editor-bridget

Danach konnte ich erfolgreich wieder von der Maschine aus ins Internet und auch von meinem Lokalen PC auf die virtuelle Maschine kommen.

Shopware-4-REST-API von .NET 4 aus ansprechen

Zurzeit arbeite ich an einem Projekt bei dem aus Microsoft Navision („Dynamics Nav“ oder wie das jetzt heißt) heraus Daten nach Shopware geschrieben werden sollen.

Dazu scheint mit die REST-API von Shopware gut geeignet zu sein. Aus diesem Grund habe ich ein Beispielprojekt geschrieben. Das ganze ist eine .NET-4-Konsolenanwendung mit einer einzigen Datei.

Den Quelltext findet Ihr nachfolgend (alternativ auch bei Pastebin):

namespace ShopwareRestApiTest01
{
    using System;
    using System.Globalization;
    using System.Net;
    using Newtonsoft.Json;
    using RestSharp;

    internal class Program
    {
        static void Main()
        {
            const string user = "demo";
            const string pass = "NtMd3OIouT2sr0aJcllBIx1fH3SgxmRr0T6r7D4P";

            // http://restsharp.org/
            var client =
                new RestClient(@"http://192.168.147.169/api")
                    {
                        Authenticator = new DigestAuthenticator(user, pass)
                    };

            var request = new RestRequest("articles/{id}", Method.GET);
            request.AddUrlSegment("id", 3.ToString(CultureInfo.InvariantCulture)); // replaces matching token in request.Resource

            // easily add HTTP Headers
            request.AddHeader("Content-Type", "application/json; charset=utf-8");

            // or automatically deserialize result
            // return content type is sniffed but can be explicitly set via RestClient.AddHandler();
            var response = client.Execute(request);

            if (response.ErrorException != null)
            {
                Console.WriteLine(@"################ ERROR ################");
                Console.WriteLine(response.ErrorException.Message);
            }
            else
            {
                var content = response.Content; // raw content as string

                dynamic json = JsonConvert.DeserializeObject(content);
                Console.WriteLine(json);
            }
        }
    }

    public class DigestAuthenticator : 
        IAuthenticator
    {
        private readonly string _user;
        private readonly string _pass;

        public DigestAuthenticator(string user, string pass)
        {
            _user = user;
            _pass = pass;
        }

        public void Authenticate(IRestClient client, IRestRequest request)
        {
            request.Credentials = new NetworkCredential(_user, _pass);
        }
    }
}

In dem Projekt verwende ich auch zum ersten Mal NuGet, dem wirkliche eleganten Paket-Manager für Visual Studio. Damit lade ich Json.NET und RestSharp als Referenz in das Projekt.

Digest Authentication with RestSharp

Since RestSharp does not provide an authenticator for Digest Authentication, I simple wrote one that works for me.

Usage

var client =
    new RestClient(@"http://yourserver.com/api")
    {
        Authenticator = new DigestAuthenticator(userName, password)
    };

Implementation

The class is rather simple:

public class DigestAuthenticator : 
    IAuthenticator
{
    private readonly string _user;
    private readonly string _pass;

    public DigestAuthenticator(string user, string pass)
    {
        _user = user;
        _pass = pass;
    }

    public void Authenticate(
        IRestClient client, IRestRequest request)
    {
        request.Credentials = new NetworkCredential(_user, _pass);
    }
}

Enjoy! 🙂

Shopware erkennt mod_rewrite nicht

Gerade hatte ich den Fall, dass der Installer von Shopware penetrant behauptet hat, dass mod_rewrite nicht installiert sein, obwohl es tatsächlich installiert ist.

Die Lösung war dann, dass in der zentralen „httpd.conf“-Apache-Konfigurationsdatei der AllowOverride-Befehl

AllowOverride none

stand. Das hat dafür gesorgt, dass die Shopware-eigene mod_rewrite-Prüfung nicht aufgerufen wurde. Nach der Änderung auf

AllowOverride All

hat dann alles funktioniert. Nach der Änderung den Apache-Dienst neu starten, z.B. unter Windows über den Apache Service Monitor.

Kostenloser Windows-HTTP-Proxy-Server

Kleiner Tipp, wenn Ihr mal zum Testen einen HTTP-Proxyserver benötigt:

CC Proxy

Dieser Proxy kann maximal 3 Benutzer unterstützen, was zum Testen ja völlig reicht. In meinem Fall habe ich ihn direkt auf meinem Test-Windows-7 in einer Vmware installiert und im Internet Explorer dann den Proxy angegeben.

Testumgebung

Um den Proxy einfach für lokale Tests zu konfigurieren, wie folgt vorgehen:

proxy-01
proxy-02
proxy-03

In Internet Explorer dann in den Einstellungen:

proxy-04

Praxistipp: Whiteboard reinigen mit Mundwasser

Heute zufällig eine Sache ausprobiert und für so gut befunden, dass sie hier verbloggt gehört:

Unsere Whiteboards im Büro haben die Eigenschaft, dass die darauf geschriebenen Notizen, trotz eigens passend angeschafter Stifte, nach einer Weile mit den trocken-Schwämmen nur schwer noch weg gehen.

Bisher habe ich halt eine Nitroverdünnung oder ähnlich giftiges Zeugs verwendet um die gröbsten Reste zu entfernen.

Heute nun bin ich durch Zufall auf die Idee gekommen, Mundwasser zu nehmen!

Wichtig dabei nach meiner Meinung, dass es sich um Mundwasser (oder „Mund Wasser“, wie die Marketing-Profis das nennen) mit Alkohol handelt.

Damit habe ich dann die Tafel geputzt und es ging ganz hervorragend ab das Zeugs!

Also vollste Empfehlung meinerseits. Als Nebeneffekt habt Ihr auch noch einen schönen Minzgeruch im Büro.

Nützlicher Zusatztipp: Die gebrauchten Küchentücher/Taschentücher nach dem Abwischen in einem verschlossenen Plastikbeutel entsorgen, sonst riecht der ganze Müll und seine Umgebung heftig nach Minze, wie heute bei uns aufm Klo den ganzen Tag.

Fixing „A dynamic link library (DLL) initialization routine failed.“ error on Windows 8

Just fixed an issue with our Zeta Producer 11 that occurs only on the brand new Windows 8. The German error message was:

Die Datei oder Assembly „ZetaHtmlTidy.dll“ oder eine Abhängigkeit davon wurde nicht gefunden. Eine DLL-Initialisierungsroutine ist fehlgeschlagen. (Ausnahme von HRESULT: 0x8007045A)

Translated to English it was:

System.IO.FileLoadException ‚A dynamic link library (DLL) initialization routine failed. (Exception from HRESULT: 0x8007045A)‘

The DLL in concern was a mixed Managed/Unmanaged C++ assembly that wrapped the popular HTML Tidy C sources into a .NET-usable assembly.

So my first idea was that some CRT DLLs were missing:

  • msvcm90.dll
  • msvcp90.dll
  • msvcr90.dll
  • Microsoft.VC90.CRT.manifest

But all were present, even the well-known Dependency Walker/Viewer did not help any further.

Since version 10 of our application worked and version 11 did not work and brought the above error, I was clueless. The main difference was:

  • Version 10 was installed into „C:\Program Files (x86)\Zeta Producer 10“.
  • Version 11 was installed into „C:\Users\YourName\AppData\Local\Zeta Producer 11″ (to bypass administrative setup permissions).

When I moved Version 10 also below the „C:\Users\…“ folder, the error also occurred!

So the cause was not a missing assembly but some kind of (weird?) policy thing.

Some further digging/googling finally lead to the solution on Stack Overflow. The solution was to add some more App.config settings.

My previous, non-working App.config file contained:

<startup>
    <supportedRuntime version="v2.0.50727"/>
    <supportedRuntime version="v4.0"/>
</startup>

My new, working App.config file was:

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v2.0.50727"/>
    <supportedRuntime version="v4.0"/>
</startup>

So it seems that setting „useLegacyV2RuntimeActivationPolicy“ to „true“ finally switched something to allow for loading mixed-mode DLLs from local folders. Doh!

MySQL-Datenbanken auf einen anderen Server umziehen

Da ich jetzt festgestellt habe, dass es eine doofe Idee ist, MySQL-Datenbanken durch schlichtes XCOPY-Deployment auf einen neuen Server zu verschieben (InnoDB-Tabellen werden scheinbar nur teilweise verschoben), habe ich diesen Artikel hier gefunden, der beschreibt, wie es geht:

How to Back Up and Restore a MySQL Database

Prinzipiell ganz einfach, alles via MySQL-Befehlszeile:

  1. Auf Quellserver ein mysqldump.exe-Aufruf auf die zu verschiebende Datenbank.
  2. Das Ergebnis (SQL-Datei) via FTP auf den Zielserver kopieren
  3. Auf dem Zielserver via phpMyAdmin eine neue, leere Datenbank als Ziel anlegen
  4. Auf dem Zielserver via mysql.exe die kopierte SQL-Datei einlesen.

Fertig.

Programmatically resize a column in a Windows Forms property grid control

Using the standard Microsoft .NET 2.0 WinForms PropertyGridControl control, I was looking for a way to set the size of the two columns (one for the labels, one for the values) so that I can control better how the values are displayed.

After some research with ILSpy on the .NET sources, I found a way to use with reflection. The following helper method can be used for this task:

public static void ResizePropertyGridSplitter(
    PropertyGrid propertyGrid,
    int labelColumnPercentageWidth)
{
    var width =
        propertyGrid.Width*(labelColumnPercentageWidth/100.0);

    // Go up in hierarchy until found real property grid type.
    var realType = propertyGrid.GetType();
    while (realType!=null && realType != typeof(PropertyGrid))
    {
        realType = realType.BaseType;
    }

    var gvf = realType.GetField(@"gridView",
        BindingFlags.NonPublic |
        BindingFlags.GetField |
        BindingFlags.Instance);
    var gv = gvf.GetValue(propertyGrid);

    var mtf = gv.GetType().GetMethod(@"MoveSplitterTo",
        BindingFlags.NonPublic |
        BindingFlags.InvokeMethod |
        BindingFlags.Instance);
    mtf.Invoke(gv, new object[] { (int)width });
}

Call the function and pass your PropertyGrid instance and width values between e.g. 10 and 90 to resize the first column to the given percentage value.

E.g.:

ResizePropertyGridSplitter( myPropGrid, 75 );

If you specify a too small or too large value, the PropertyGrid seems to use the minimum/maximum possible, based on your passed value.