Ich darf mich gerade, für ein Kundenprojekt, mit der Siemens TIA Portal API beschäftigen. Ist schon einige Jahre her dass ich das gemacht habe.
Viel hat sich geändert, im API-Design, und es sind viele neue Funktionen dazu gekommen.
Wird eine Openness Applikation ausgeführt muss dies vom User bestätigt werden:
Dies muss jedesmal gemacht werden wenn sich der Hash des Programms oder das Datum (LastModified) geändert hat. Das ist natürlich beim Debuggen schlimm, wenn jedes mal der Dialog kommt.
Ich hab mal die Methode hier gebastelt welchen den Whitelist-Eintrag (Bestätigung durch User) selbst macht:
public static void SetTiaPortalFirewall() { // Check if admin WindowsIdentity identity = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(identity); bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator); if (!isAdmin) { return; } Assembly assembly = Assembly.GetExecutingAssembly(); string exePath = assembly.Location; // Get hash HashAlgorithm hashAlgorithm = SHA256.Create(); FileStream stream = File.OpenRead(exePath); byte[] hash = hashAlgorithm.ComputeHash(stream); string convertedHash = Convert.ToBase64String(hash); // Get date FileInfo fileInfo = new FileInfo(exePath); DateTime lastWriteTimeUtc = fileInfo.LastWriteTimeUtc; string lastWriteTimeUtcFormatted = lastWriteTimeUtc.ToString("yyyy'/'MM'/'dd HH:mm:ss.fff"); // Get execution version AssemblyName siemensAssembly = Assembly.GetExecutingAssembly().GetReferencedAssemblies().First(obj => obj.Name.Equals("Siemens.Engineering")); string version = siemensAssembly.Version.ToString(2); // Set key and values string keyFullName = $@"SOFTWARE\Siemens\Automation\Openness\{version}\Whitelist\{fileInfo.Name}\Entry"; RegistryKey key = Registry.LocalMachine.CreateSubKey(keyFullName); if (key == null) { throw new Exception("Key note found: " + keyFullName); } key.SetValue("Path", exePath); key.SetValue("DateModified", lastWriteTimeUtcFormatted); key.SetValue("FileHash", convertedHash); }
Adminrechte müssen da sein. Somit muss man Visual Studio als Administrator starten.
Hallo Johann,
vielen Dank für den Code. Ich habe es bei mir (Windows 10 und TIA V15) implementiert und bin auf ein kleines Problem gestoßen. Der Eintrag in die Registry wird automatisch in den WOW64 Ordner verschoben. Also statt
HKEY_LOCAL_MACHINE\SOFTWARE\Siemens\Automation\Openness\15.0\Whitelist…
in
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Siemens\Automation\Openness\15.0\Whitelist…
Dadurch kann die TIA Firewall diesen Eintrag nicht finden. Ich habe nach langer Suche keinen einfachen Weg gefunden die registry redirection zu umgehen. Wie hast du das gemacht?
Schöne Grüße
Kadir
Hi Kadir,
mhhh… bei mir ist das nicht der Fall. Wie ist deine Einstellung in Visual Studio Projekt für Target? 32/64/Any CPU.
Hallo Johann,
Bei den Einstellungen in Visual Studio habe ich alle Varianten (32/64/Any) ausprobiert, ohne Erfolg. Ich habe weiter recherchiert und bin auf die folgende Seite gestoßen.
https://www.codeproject.com/Tips/1200669/Registry-Redirection-when-using-bit-Application-on
Hier wird das Problem erklärt und beschrieben, wie man es umgehen kann. Damit war es möglich die Registry Einträge richtig zu platzieren und schon hat es funktioniert.
“`csharp
var localMachine = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var softwareSubKey = localMachine.OpenSubKey(“Software”, RegistryKeyPermissionCheck.ReadWriteSubTree);
softwareSubKey.CreateSubKey(“MySoftware”);
“`
Vielen Dank dafür, dass du den Code geteilt hast. Die Firewall hat tierisch genervt :-).
Schöne Grüße
Kadir
Hallo Kadir,
Danke für die Lösung. Hast du mal geschaut ob “Prefer 32bit” Checkbox aktiv ist? Kann mir eigentlich nur das so erklären dass dein Programm / DLL in 32bit ist und dass so gemapped wird.
“32 Bit bevorzugen” ist bei mir nicht gesetzt, bin mir jetzt aber auch nicht sicher, ob das vor dem Probieren gesetzt war.
Danke Johann, danke Kadir !
Ich hatte ebenfalls Kadirs Problem (“Kadirs Problem” klingt gut, fast wie “Fermat-Problem”) und möchte nochmal zusammenfassen, was genau ich am obigen Code ändern musste. Aus folgenden zwei Zeilen:
string keyFullName = $@”SOFTWARE\Siemens\Automation\Openness\{version}\Whitelist\{fileInfo.Name}\Entry”;
RegistryKey key = Registry.LocalMachine.CreateSubKey(keyFullName);
mussten stattdessen folgende Zeile werden:
string keyFullName = $@”Siemens\Automation\Openness\{version}\Whitelist\{fileInfo.Name}\Entry”;
var localMachine = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var softwareSubKey = localMachine.OpenSubKey(“Software”, RegistryKeyPermissionCheck.ReadWriteSubTree);
RegistryKey key = softwareSubKey.CreateSubKey(keyFullName);
Frohes Schaffen :D