Laden...

Forenbeiträge von brave_snoopy Ingesamt 99 Beiträge

30.05.2015 - 10:46 Uhr

DeleteFile scheint ja nur für Dateien zu sein. Ich habe mal nach RemoveDirectory geschaut und diese Funktion aufgerufen.


[DllImport("kernel32.dll")]
        public static extern bool RemoveDirectory(string path);
        
        private void ClearSystemDir(string path)
        {

            RemoveDirectory(@"C:\Users\testuser\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Accessories\System Tools");

        }

Die Funktion funktioniert, "normale" Ordner werden gelöscht. Aber diese "System Dirs" nicht. Interessanterweise gibt es nicht mal eine Fehlermeldung. Es passiert einfach nichts.

29.05.2015 - 22:02 Uhr

Ich habe mir hierzu noch mal ein paar Gedanken gemacht.

Was haltet ihr davon, von den erstellten Verknüpfungen einen MD5 Hash zu erzeugen und diesen in einer eigenen DB/XML sonstwas zu speichern. Wenn nun eine Verknüpfung entfernt wird, werden alle *.lnk Dateien im Startmenü und Desktop durchsucht, eben nach diesem MD5 Hash.

Wenn eine Verknüpfung umbenannt wird, ändert sich der MD5 Hash nicht, habe ich schon getestet.

Wäre dies ein Ansatz? (Klar, verschiebt der Benutzer nun eine Verknüpfung nach DOkumente, dann kann ich das auch nicht abfangen, aber es wäre schon mal ein Anfang)

Oder fällt euch noch eine Idee ein?

29.05.2015 - 19:35 Uhr

Das klingt so, als wenn ihr auch keine wirkliche Lösung habt.

Irgendeine Idee, vlt eine Delete API direkt anzusprechen? Gibt es da irgendwas im Bereich C++/WINAPI direkt?

26.05.2015 - 20:27 Uhr

Hi brave_snoopy,

hab ich das richtig verstanden, daß du die Systemsteuerung aus dem Startmenü löschen möchtest, und dich darüber wunderst, daß das nicht funktioniert? Ich glaube, solche Sachen sollte man gar nicht erst ausprobieren...

Christian

Nein, ich möchte nicht die Registrierung aus dem Startmenü löschen.

Insgesamt hört sich das sehr nach Unternehmensnetzwerk an; und falls Du Deinen Benutzern irgendwelche Ordner wegnehmen willst, sodass diese nicht sichtbar sind, dann verwende die Policy Tools von Microsoft, die genau für diesen Fall gedacht sind und nicht so nen Schmarrn mit nem C# Tool.

Ja es geht um eine Unternehmensanwendung und nein, diese Ordner werden nicht von IT gepusht oder sonstwie von irgendwelchen Richtlinien.

Diese Ordner sind die Standardordner bei jedem WIndows 7. Im Deutschen: Zubehör, Wartung, Autostart, Verwaltung...

Diese Ordner werden "erstellt", wenn der Benutzer sich das erste mal an einem PC anmeldet und nicht über ein "Roaming Profil" verfügt. Diese Ordner liegen zum Beispiel im Default Profil unter:

"C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs" und werden einfach in das neu zu erstellende Profil kopiert. Natürlich kann ich diese Ordner im Default Profil auch entfernen und alle neuen Benutzer bekommen die Ordner nicht mehr.

Ich möchte dieser Ordner aber gerne bei den schon vorhandenen Profilen löschen.
Wie "SomeoneYouKnow" schon schrieb, kann ich die Ordner auch nicht mit rmdir löschen. Mit dem Windows Explorer aber schon. Das ist ja die Krucks an der Sache.

26.05.2015 - 18:01 Uhr

Hi,

Das tut mir leid. Ja ich möchte alle Ordner löschen. Ich habe die Ausnahme nur gebaut, damit mein Programm nicht auf die Nase fällt.

Aber danke das du mich trotzdem verstanden hast.

Hast du denn eine Idee, wie ich diese Ordner doch löschen kann? interessant ist ja, dass ich sie geleert bekomme, aber nicht gelöscht 😉

Evtl. Die winapi Funktion direkt aufrufen?

26.05.2015 - 16:46 Uhr

Also bei mir fliegt er bei allen Foldern auf die Nase mit "Zugriff Verweigert".
(Habe die UAC deaktiviert)

24.05.2015 - 21:15 Uhr

Hallo,

der Benutzer verfügt über keinerlei Admin Berechtigungen, daher wird das nicht funktionieren.
Interessant ist ja, dass der Benutzer die Ordner selbst löschen kann, nur eben die .NET Anwendung nicht.
Ich tippe, dass es irgendwas mit der Löschen Funktion zu tun hat.

23.05.2015 - 21:30 Uhr

Hallo,

mein Programm läuft im Kontext des angemeldeten Benutzers und soll alle Verknüpfungen in seinem Startmenü löschen.

Dafür habe ich folgende Methode:


public void ClearDirectory(string path)
        {
            //System Dirs who cannot be deletes
            List<string> SystemDirs = new List<string>();
            SystemDirs.Add("Accessories");
            SystemDirs.Add("Ease of Access");
            SystemDirs.Add("System Tools");
            SystemDirs.Add("Administrative Tools");
            SystemDirs.Add("Startup");
            SystemDirs.Add("Maintenance");
            
            //End System Dirs            
            
            DirectoryInfo dir = new DirectoryInfo(path);
            foreach(DirectoryInfo subDir in dir.GetDirectories())
            {
               if(!SystemDirs.Contains(subDir.Name))
               {
                   subDir.Delete(true);
               }
                
            }
            foreach(FileInfo file in dir.GetFiles())
            {
                file.Delete();
            }
            
        }

Und rufe diese wie folgt auf:

ClearDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Programs));

Damit werden alle Anwendungsverknüpfungen im Startmenü des derzeitigen Benutzers gelöscht. Dies sind idr. nicht viele. Nur die, welche durch das Default Profil bei der 1. Anmeldung dort erstellt wurden.

Oben in der Methode habe ich ein paar Verzeichnisse aufgelistet. Wenn ich versuche diese über mein Programm löschen zu lassen, erhalte ich eine Fehlermeldung "Zugriff verweigert". Lösche ich den Ordner als angemeldet Benutzer manuell über den Windows Explorer, so funktioniert dies einwandfrei.

Scheinbar hat hier .Net eine Abfrage bzw. Sicherheit, keine Systemordner zu löschen.

Habt ihr eine Idee, wie ich das Problem beheben kann?

13.04.2015 - 07:58 Uhr

Hallo Abt,

da ich nicht wirklich viel programmiere, fehlt mir hier die Erfahrung, was es alles gibt.

Kann ich mit dem FileSystemWatcher auch Ereignisse nach verfolgen, wenn meine Anwendung nicht lief?

12.04.2015 - 20:38 Uhr

Hallo,

ich kenne es z.B. vom Citrix Online Plugin. Das erstellt Programmverknüpfungen im Startmenü oder Desktop. Und wenn man das Plugin schließt, kann es alle zuvor erstellten Verknüpfungen auch wieder entfernen.

Vielleicht hat ja noch jemand eine Idee, wie man dies am besten realisieren kann.

12.04.2015 - 14:40 Uhr

Hallo,

ich habe eine Solution, bestehend aus zwei Projekten. Dieser Solution habe ich nun ein Install Shield Lite Projekt hinzugefügt. Soweit gut.

Wie handhabe ich nun aber die Produkt Updates?
Ich möchte bei einem Update das vorhandene ja nicht löschen, sondern nur über installieren und damit die Exe Dateien austauschen.

Es gibt ja so etwas wie einen Product Code und Upgrade Code.

Habt ihr hierzu ein paar Infos? Und vor allem, auf was ich als Anfänger dabei achten muss?

Vielen Dank.

12.04.2015 - 10:28 Uhr

Hallo Abt,

Wie meinst du das? Ich müsste ja irgendwie die von mir erstellten Shortcuts identifizieren, selbst wenn der Benutzer diese umbenennt.

Edit: im Prinzip müsste es ja genau so möglich sein, wie ein Setup Projekt. Wenn man es deinstallieren, werden die zuvor erstellten Shortcuts im Startmenü ja auch gelöscht.
Gibt es eine Art Tag, welche man an ein Shortcut hängen kann um dann danach in meinem Programm zu suchen?

11.04.2015 - 19:06 Uhr

Hallo,

Ich erstelle mit meiner Anwendung Shortcuts im Startmenü. Soweit alles gut.
Ich suche nun nach einer Lösung, wie ich die erstellten shortcuts "tracken" kann.

Bedeutet, wenn die Verknüpfung in der Managemt Konsole dem User entzogen wird, soll sie auch beim Benutzer gelöscht werden.

Habt ihr dazu irgendwelche Ideenansätze? Ich bin für alles offen 😉

11.04.2015 - 17:56 Uhr

Hallo,

vielen Dank. Ich habe es hinbekommen. So sieht mein Comparer aus.


        public int Compare(object x, object y)
        {
            TreeNode tx = x as TreeNode;
            TreeNode ty = y as TreeNode;


            if ((string)tx.Tag == "0" && (string)ty.Tag == "0")
                return string.Compare(tx.Text, ty.Text);
            if ((string)tx.Tag != "0" && (string)ty.Tag != "0")
                return string.Compare(tx.Text, ty.Text);
            
            // If they are the same length, call Compare. 
            //return string.Compare(tx.Tag.ToString(), ty.Tag.ToString());
            return string.Compare(tx.Tag.ToString(), ty.Tag.ToString());
        }


Nur für mein Verständniss: Der Comparer tauscht Element X und Y gegeneinander aus, jenachdem ob der Rückgabewert -1 oder 1 ist? Oder wie kann man es verstehen?

10.04.2015 - 19:36 Uhr

Hallo Chilic,

Leider komme ich damit nicht weiter. Hast du ein etwas Code für mich?

Vielen Dank.

10.04.2015 - 19:34 Uhr

Hallo,

Nachdem ich rausbekommen habe, dass diese Shortcuts advertised shortcuts heißen, habe ich diese Seite gefunden.
Mit der Klasse funktioniert das Auslesen hervorragend.

https://astoundingprogramming.wordpress.com/2012/12/17/how-to-get-the-target-of-a-windows-shortcut-c/

09.04.2015 - 21:13 Uhr

Hallo,
ich versuche derzeit verzweifelt, meine TreeView richtig zu sortieren.

Meine Nodes haben ein Tag und einen Text.
wenn der Tag = 0 ist, hat dieser einen Subnode.
Wenn der tag > 0 ist, ist es ein normaler Node

Ich möchte meine Nodes nach Tag + Text aufsteigend sortieren.
Allerdings, Sollen erst alle Datensätze mit Tag=0 nach Alphabet sortiert nach oben dargestellt werden, und alle restlichen Datensätze nur nach Text aufsteigend sortiert, da drunter.

Die Daten werden in wilder Form in die TreeView geladen.

ID1:Tag=2;Name=Fuba
ID2:Tag=0;Name=Bravo
ID3:Tag=0;Name=Alpha
ID4:Tag=1;Name=Zap
ID5:Tag=4;Name=Cesar

Ich möchte gerne die Nodes so sortiert haben
ID3:Tag=0;Name=Alpha
ID2:Tag=0;Name=Bravo
ID5:Tag=4;Name=Cesar
ID1:Tag=2;Name=Fuba
ID4:Tag=1;Name=Zap

Ich bekomme es derzeit mit dem IComparer nur hin, nur nach Tag, oder nur nach Text zu sortieren.

Vielen Dank für eure Hilfe.

04.04.2015 - 16:10 Uhr

Ach bin ich Blind. Vielen Dank.

Habe jetzt diese Zeile


pictureBox_ICON.Image.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);

geändert, so dass ImageFormat nun PNG ist. Funktioniert super.

Schöne Ostern.

04.04.2015 - 15:17 Uhr

verwendetes Datenbanksystem: MS SQL 2008 R2

Hallo,

ich lese ein Icon von einer EXE Datei ein und stelle es in einer PictureBox auf meiner WinForm dar.

Da das Icon erhalten bleiben soll, speicher ich es in meiner Datenbank. Die Spalte ist als varbinary(MAX) deklariert.
Das funktioniert soweit auch ganz gut. Allerdings haben Icons oft transparente Bereiche. Und nachdem ich das Icon wieder aus der Datenbank auslese, sind diese transparenten Bereiche nicht mehr vorhanden.

Habt ihr eine Idee, wie ich die transparenten Bereiche erhalten kann?

Speichern in Datenbank wie folgt:


byte[] pic = null;
                        if(pictureBox_ICON.Image!=null)
                        {
                            MemoryStream stream = new MemoryStream();
                            pictureBox_ICON.Image.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
                            pic = stream.ToArray();
                        }
                                                
                        cmd1.Parameters.AddWithValue("@Icon",pic);
                        cmd1.ExecuteNonQuery();

Lesen aus der Datenbank und Übergabe an PictureBox



SqlDataReader rdr = cmd.ExecuteReader();

while (rdr.Read())
{
                    byte[] pic = new byte[0];
                    
                    pic = (Byte[])rdr["Icon"];
                    if (pic.Length > 0)
                    {
                        MemoryStream stream = new MemoryStream(pic);
                        pictureBox_ICON.Image = Image.FromStream(stream);
                    }
}

Vielen Dank

03.04.2015 - 12:59 Uhr

Hallo,

ich schreibe an einem Programm zum einlesen von Shortcut Dateien. (*.lnk)

Bei "normalen" Verknüpfungen klappt das super mit diesem Code:


public string GetShortcutTargetPath(string shortcutFilename)
        {
            string pathOnly = System.IO.Path.GetDirectoryName(shortcutFilename);
            string filenameOnly = System.IO.Path.GetFileName(shortcutFilename);

            Shell32.Shell shell = new Shell32.ShellClass();
            Shell32.Folder folder = shell.NameSpace(pathOnly);
            Shell32.FolderItem folderItem = folder.ParseName(filenameOnly);
            if (folderItem != null)
            {
                Shell32.ShellLinkObject link =
            (Shell32.ShellLinkObject)folderItem.GetLink;
                return link.Path;
            }
            return ""; // not found
        }

Ich bekomme den Pfad zu der Exe Datei von dem Programm.

Leider sind Office 2010/2013 Verknüpfungen andere Verknüpfungen.

Bei Word 2013 bekomme ich als Target Path zum Beispiel nur "C:\Windows\Installer{90150000-0011-0000-0000-0000000FF1CE}\wordicon.exe" zurück gegeben.

Habt ihr eine Idee, wie ich bei diesen Verknüpfungen den Pfad zur Winword.exe und das Arbeitsverzeichnis auslesen kann?

31.03.2015 - 10:28 Uhr

Guten Morgen,

danke für die Antworten. Ich bin mir bewusst, dass ich hier Datenschicht und Präsentationsschicht mische.
Leider bin ich kein Programmierer der sich jeden Tag mit C# auseinander setzt.
Da mein Programm nicht wirklich groß ist/wird habe ich mich bewusst für das "vermischen" der Schichten entschieden.

Ich habe allerdings ein Logikproblem. Ich komme leider nicht auf die Lösung, wie ich den Baum am besten erstelle. "Rekursive Auflösung" trifft es wohl ganz gut. Habe dazu auch jetzt ein paar Artikel gefunden.

Ich bekomme nur leider die Nodes nicht richtig erstellt.
Problem ist vor allem, Wenn z.B. der Dritte Datensatz wieder das gleiche Folder ist, dann muss ich den Node ja unter dem 1. getroffenen Folder erstellen. Ich möchte ja kein weiteres Node mit dem gleichen Namen haben.

Mit treeview.Nodes.Find oder .Contains komme ich hier leider nicht wirklich weiter.

Ich wäre sehr dankbar, wenn ihr mir auf die Sprünge helfen könntet.

30.03.2015 - 19:31 Uhr

Hallo,

ich habe ein Logik Problem und komme einfach nicht auf die Lösung.

Und zwar habe ich in meiner Datenbank ein Feld das heißt "Name". Hier steht entweder der Name einzeln drin ("ApplicationName1"), oder aber in dieser Form "Folder1\SubFolder1\ApplicationName2"

Beispiel:

ApplicationName1
Folder1\SubFolder1\ApplicationName2
Folder1\SubFolder1\ApplicationName3
Folder1\ApplicationName4
ApplicationName5
usw.

Nun möchte ich diesen Baum gerne in einer TreeView darstellen. Sind keine Verzeichnisse im Namen, steht die Application ganz oben. Sind verzeichnisse im Namen, dann sollen SubNodes angelegt werden.

Meine Routine sieht bis jetzt so aus. Leider klappt es vorne und hinten nicht, dass ich dynamisch die Daten auslese und in die richtigen SubNodes einsortiere.


while (rdr.Read())
                {
                    //string ShortcutName = "";
                    string Name = rdr.GetString(1);
                    
                    if (Name.Contains('\\') == true)
                    {
                        string[] Path = Name.Split('\\');
                        
                        for (int i = 0; i < Path.Length - 1; i++)
                        {
                            TreeNode[] nodes = treeView_Applications.Nodes[i].Nodes.Find(Path[i], false);
                            if (nodes.Length > 0)
                            {


                                //SubPath += Path[i] + "\\";
                                //TreeNode[] nodes = treeView_Applications.Nodes.Find("test", false);

                                TreeNode node = new TreeNode();
                                node.Text = Path[i];
                                node.Tag = rdr.GetInt32(0);
                                nodes[1].Nodes.Add(node);

                            }
                            else
                            {
                                TreeNode node = new TreeNode();
                                node.Text = Path[i];
                                node.Tag = rdr.GetInt32(0);
                                treeView_Applications.Nodes.Add(node);
                            }

                        }   
                        
                    }
                    else
                    {
                        TreeNode node = new TreeNode();
                        node.Text = rdr.GetString(1);
                        node.Tag = rdr.GetInt32(0);
                        treeView_Applications.Nodes.Add(node);
                        
                    }

                    
                }

Ich wäre sehr Dankbar, wenn mir jemand auf die Sprünge helfen kann.
Vielen Dank

30.03.2015 - 14:35 Uhr

so arbeite ich derzeit. Ist das denn noch ein aktueller Weg?

Wäre Linq oder eine alternative einfacher?

30.03.2015 - 14:00 Uhr

verwendetes Datenbanksystem: MS SQL 2008 R2 Standard

Hallo,
ich nutze das Visual Studio Community Edition 2013 und möchte gerne auf eine SQL Datenbank zugreifen.

Derzeit mache ich den Zugriff manuell über SQLCOMMAND.

Meine Datenbank besteht nur aus 3 Tabellen mit ca. 4-6 Spalten pro Tabelle.
Also nicht sehr aufwendig. Allerdings möchte ich gerne unabhängig von der Datenbankverbindung sein.

Also SQL Server, SQL Express, oder eine lokale mdf Datei würde ich gerne ansteuern mit dem gleichen Stück Code.

Die Darstellung der SQL Daten soll in einem TreeView angezeigt werden, bzw. in einer selbst erstellten Form mit Textboxen.

Welche Art der SQL Anbindung in C# ist hierfür wohl am sinnvollsten bzw. am einfachsten?

23.03.2015 - 17:37 Uhr

Hallo,

Jeder kennt ja sicher das typische AD Fenster wenn man nach Benutzern und Gruppen im Ad sucht.
Kann man dieses auch in seiner Anwendung starten und nutzen? Oder muss ich es selbst bauen?

Wenn man das vorhandene nutzen kann, wenn ja, wie?

20.03.2015 - 16:26 Uhr

Hallo,

ich möchte gerne ein Programm erstellen, welches mir verschiedene Verknüpfungen erstellt.
Ich habe bis jetzt nur die Möglichkeit gefunden, diese Verknüpfungen über das COM Objekt Windows Scripting Host zu erstellen.

Die Besonderheit soll sein, ich möchte die Parameter der Verknüpfungen in einer SQL Datenbank speichern, samt ICON. Wenn das Programm gestartet wird, soll es die Daten auslesen und dadurch die Verknüpfungen samt ICON erstellen.

Habt ihr eine Idee, wie ich das mit dem ICON am besten anstelle? Vor allem wie ich das ICON anschließend in der Verknüpfung hinterlege, da auf dem Zielsystem die Ursprungs exe, dll oder Icon Datei nicht vorhanden sein wird.

19.06.2014 - 19:09 Uhr

Das Problem ist, der Zeitstempel muss 100% identisch sein, damit die dadrüber liegende Anwendung welche die Datei (VHD) nutzt, erkennt, dass auf ServerA und ServerB es sich um die gleiche Datei handelt.

Blöderweise arbeitet Sie ausschließlich mit dem Zeitstempel.

18.06.2014 - 17:28 Uhr

Hallo,

in meinem Programm müsste ich große Dateien (40GB und mehr) von einem Server zu einem anderen kopieren/Synchronisieren.

D.h. der Zeitstempel der Datei muss auf Quellserver A und Zielserver B exakt der gleiche sein.

Schön wäre auch noch ein Fortschrittsbalken.

Hat jemand von euch so etwas schon gemacht, bzw. eine Idee oder kennt jemand eine Open Source Library dafür?

09.04.2014 - 20:46 Uhr

Weil Citrix/XenApp keine richtige Verbindung aufbaut. Die schauen nur, ob z.B. der IMA Dienst läuft.

Aber es hängen ja doch noch einige mehr Faktoren ab, ob die Sitzung wirklich sauber gestartet werden kann. Wir hatten selbst schon den Fall, dass laut Monitoring alles in Ordnung war und einer von 10 Hosts zwar angefangen hat die Sitzung aufzubauen, doch mittendrin ist der Prozess einfach hängen geblieben.

Daher die Anwendung und die Frage wie ich aus der Sitzung heraus den Status am besten reporten kann.

08.04.2014 - 20:09 Uhr

Hallo,

ich bin auf der Suche nach einer Idee wie es praktisch am besten und einfachsten umgesetzt werden kann. Meine Programmierkenntnisse in C# sind recht rudimentär aber ich versuche mich gerade an einem kleinen Projekt.

Das Projekt besteht aus 2 Komponenten.

  1. Ein Windows Service wo Quartz.Net bereits implementiert ist als Zeitgeber.
    Alle x Sekunden wird eine Verbindung zu einem Terminalserver aufgebaut
    (Das funktioniert bereits)

2)Eine Anwendung auf dem Terminalserver, welche in der Sitzung gestartet wird, die der Service aufbaut. Die Anwendung soll dann an den Service ein "OK und Zeitstempel" senden, so dass der Service weiß, dass die Anwendung auf dem Terminalserver erfolgreich nach x Sekunden gestartet wurde.
Anschließend soll die Anwendung die Sitzung wieder abmelden.(Dies funktioniert bereits)

Nun gibt es natürlich x beliebige Terminalserver und der Service baut in einer Foreach schleife alle x Sekunden eine Sitzung auf. Auch kann es sein, dass die Anmeldung am TS1 länger dauert als am TS6.

Nun die Frage, wie ich es designe/programmiere dass beim Starten der RDP Sitzung ein Log geführt wird(im RAM reicht) zu welchem TS eine Verbindung aufgebaut wurde und ob bereits ein OK gesendet wurde.

Ist nach 3 Verbindungsaufbauten kein OK gekommen, so wird der TS als "Down" markiert und ein Fehler wird protokolliert.

Ich hoffe meine Anforderung ist verständlich rüber kommen.

Das ganze muss ja irgendwie multithreaded sein, mit einer zentralen Art von DB im RAM.
Ich hätte auch gedacht, dass der Service auf einem TCP Port lauscht und die Anwendung per TCP Verbindung die Daten in der Art von TSNAME:OK:ZEIT sendet.

Allerdings wäre natürlich auch eine Art Session Nummer nicht schlecht, um zu sehen, in welcher Reihenfolge die Verbindungen zu Stande gekommen sind.

Achja und die Verbindungen werden über das Citrix Online Plugin (wfcrun32.exe) gestartet. Da ist leider nix mit Parameter übergeben. Aber das Sitzungsstarten funktioniert einwandfrei.

Danke für eure Ideen.

16.01.2014 - 20:20 Uhr

Hallo,

ich versuche mich gerade an einer kleinen Server/Client Anwendung. Diese soll auf einem TCP Port laufen und mehrere Client Verbindungen gleichzeitig annehmen.
Allerdings ist es wichtig, dass der Client Thread auch mit der Hauptanwendung Daten austauschen kann.

Ich habe leider nichts einfaches für einen C# Neuling gefunden, wie man dies am einfachsten stabil umsetzt.

Habt ihr da evtl. sogar schon was fertiges bzw. ein Tutorial, wo dies recht anschaulich dargestellt wird?

30.10.2013 - 12:22 Uhr

mh, habe ich jetzt eben mal probiert. Leider bekomme ich dort auch einen Konvertierungsfehler.

ich speicher das Kennwort in der SQL Datenbank.

Kann es mit dem Encoding irgendwas zu tun haben? Mein Datenbankfeld hat als Format "text".

Nicht das mir die Datenbank meinen Verschlüsselten text zerhackt und ich es deswegen nicht wiederherstellen kann. Denn ohne das Abspeichern in der DB funktioniert es ja.

29.10.2013 - 16:22 Uhr

Hallo,

ich brauche eine AES Verschlüsselung in meinem Programm. Dafür greife ich auf die .NET AesCryptoServiceProvider Klasse zurück.

Ich habe dazu eine kleine eigene Klasse um deren Klasse herum geschrieben:


public class EPMCrypt
    {
        private string AESkey = @"!QAZ2WSX#EDC4RFV";
        private string AESIV = @"5TGB&YHN7UJM(IK<";
        AesCryptoServiceProvider aes;

        public EPMCrypt()
        {
            aes = new AesCryptoServiceProvider();
            aes.Key = Encoding.UTF8.GetBytes(AESkey);
            aes.IV = Encoding.UTF8.GetBytes(AESIV);
            aes.BlockSize = 128;
            aes.KeySize = 128;
            

        }
        /// <summary>
        /// Methode zum verschlüsseln von Daten
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public string Encrypt(string text)
        {
            byte[] src = Encoding.Unicode.GetBytes(text);

            // encryption
            using (ICryptoTransform encrypt = aes.CreateEncryptor())
            {
                byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length);

                // Convert byte array to Base64 strings
                return Convert.ToBase64String(dest);
            }
        }
        /// <summary>
        /// Methode zum entschlüsseln von Daten
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public string Decrypt(string text)
        {
            byte[] src = System.Convert.FromBase64String(text);

            // decryption
            using (ICryptoTransform decrypt = aes.CreateDecryptor(aes.Key,aes.IV))
            {
                
                byte[] dest = decrypt.TransformFinalBlock(src, 0, src.Length);
                
                return Encoding.Unicode.GetString(dest);
            }
        }
    }

Wenn ich nun in meinem Programm die Klasse mit

EPMCrypt crypt = new EPMCrypt();
aufrufe und anschließend in einem Abwasch encrpte und sofort wieder decrypte, funktioniert alles wie gewünscht.

Nun encrypte ich aber und speicher das Kennwort in einer SQL Datenbank. Irgendwann später, lese ich die Daten aus der SQL Datenbank und will sie wieder decrypten. Doch dabei erhalte ich aktuell folgende Fehlermeldung während mein Programm abstürzt:> Fehlermeldung:

Die Zeichenabstände sind ungültig und können nicht entfernt werden.

Ändere ich den aes.Create Decryptor() wie folgt ab:

VON:


using (ICryptoTransform decrypt = aes.CreateDecryptor(aes.Key,aes.IV))

NACH:


using (ICryptoTransform decrypt = aes.CreateDecryptor())

Dann erhalte ich folgende Fehlermeldung:> Fehlermeldung:

Zum Entschlüsseln eines Werts muss für das Algorithmusobjekt ein Schlüssel festgelegt werden.

Was aber nicht sein kann, da ich ja die EPMCrypt Klasse direkt vor dem decrypten inistialisiere.

Hat da jemand wohl eine Idee, warum das nciht funktioniert wie gewünscht?

27.10.2013 - 11:02 Uhr

verwendetes Datenbanksystem: MS SQL 2008 R2

Hallo,

ich baue seit langem mal wieder eine Datenbankanwendung auf Basis C# .NET 4.5 und SQL 2008 R2.

Nun hab ich mich ein wenig durch das Visual Studio 2012 geklickt und festgestellt, es gibt einige Wege um Datenbank Anwendungen zu programmieren.

Version 1: Der alte Weg. SELECT, INSERT, UPDATE usw. manuell schreiben. Sehr aufwendig.

Version 2: DataSets zu nutzen.

Version 3: EntityFramework nutzen.
Nachteil: Sehr aufwendig für den Anfänger.

Prinzipiell würde ich zu Version 2 tendieren. Aber ist das denn richtig, dass ich trotzdem zwischendrin immer die SELECT Anweisungen schreiben muss um das DataSet wieder neu zu füllen?

Zudem habe ich nirgends wirklich eine verständliche Einführung gefunden.

Habt ihr da etwas? Oder welchen Weg würdet ihr empfehlen?

PS: Es ist eine relativ kleine Anwendung, welche aus maximal 10 Tabellen bestehen wird. Aber ich bin halt faul was das getippe angeht 😉

24.10.2013 - 20:29 Uhr

verwendetes Datenbanksystem: MSSQL 2008 R2

Hallo,

ich bin gerade in den Anfängen eines SQL Clients. Dieser soll von mehreren Benutzern gleichzeitig genutzt werden. Der Client baut eine SQL Verbindung zum Datenbankserver auf und läd die Table in ein DataSet, so dass ich mit dem TableAdapter arbeiten kann.
(Ich nutze hier die GUI Elemente und Wizards vom Visual Studio 2012)

Nun frage ich mich, wenn Benutzer A nun Änderungen um DataSet macht und Benutzer B gleichzeitig in seinem Client Änderungen in seinem DataSet und beide Nacheinander ein Update machen, wie verhält sich da der SQL Server, so dass die Daten nicht überschrieben werden, bzw. verloren gehen.

Gruß

Stefan

28.08.2013 - 22:42 Uhr

Hallo,

ich möchte gerne in meiner Anwendung mit Panels arbeiten um verschiedene "Menüoptionen" darzustellen, anstatt eine MDI Anwendung zu erstellen.

Vom Prinzip ist es klar. Ich nehme ein Panel, Dock=Fill. und platziere meine Elemente dadrauf und setze Visible auf false. Und dann mit dem zweiten und dritten usw.

Problem ist nun, wenn ich im Visual Studio 2012 im Designer wieder mein 1. Panel bearbeiten möchte, weiß ich nicht, wie ich das wieder nach vorne hole um es zu bearbeiten.

Wie löst ihr das Problem?

05.10.2012 - 09:13 Uhr

Hallo,

ich habe für mein Programm ein Visual Studio Setup Projekt erstellt und meiner Solution hinzugefügt. Bei der Erstinstallation ist auch alles in Ordnung.
Aber wenn ich mein Programm update und neu kompiliere und anschließend auch wieder eine neue MSI bereitstelle und diese auf den Systemen installieren möchte, dann sagt mir mein Windows Installer, dass bereits eine Version installiert ist und verweigert damit die Neu Installation.

Ich habe aber bevor ich die MSI erstellt habe, die MSI Programm Version angehoben und z.b. von 2.0 auf 2.1 und damit auch einen neuen Upgrade Code erstellt.

Habt ihr eine Idee woran es liegt, das ich meine Anwendung nicht updaten kann?

02.10.2012 - 15:42 Uhr

Hallo,

wisst ihr, ob es möglich ist von einer eigenen Anwendung aus auf Bilder eines per USB angeschlossenen Windows Phones 7 oder 7.5 zuzugreifen.

Hintergrund ist, dass ich gerne aus meiner Anwendung heraus die Bilder vom Windows Phone herunterladen möchte, ohne die mitgelieferte Software zu nutzen. (Einfach damit es für den Anwender NOCH einfacher ist 😉 )

07.12.2011 - 16:23 Uhr

Hallo,

ich habe lange kein C# mehr programmiert und bin nun dabei eine Multithread Anwendung zu schreiben. Ich möchte bestimmte Aufgabe in Threads auslagern. Hierzu möchte ich Parameter beim Starten mitgeben (eine Klasse und einen String)

Sobald der Thread mit seiner Aufgabe fertig ist, soll er mir die Daten natürlich zurück geben.
Ich arbeite derzeit mit Framework 4 und Studio 2010 Express.

Hat sich im Bereich threading etwas getan seit 2.0 ?
Welches ist aktuell die beste Möglichkeit dies zu realisieren? Ich habe etwas von Backgroudn worker gelesen?!

Hat einer nen bisschen Beispiel code?

Vielen Dank

06.12.2011 - 20:24 Uhr

Ok, das mit dem XML versteh ich, allerdings bei List<string> hab ich ja nur quasi eine Liste und kann somit nur einen Computer abbilden.

Ich benötige ja dann eine Liste in einer Liste.

Hab mir die List<string> angesehen und als Methoden finde ich nur Add, womit ich dann einen string hinzufügen kann.

06.12.2011 - 20:01 Uhr

Ok, das sieht ganz gut aus mit list<T>.

Mh ich hätte vielleicht dazu schreiben sollen, wie ich mir die Daten vorstelle. Hier mal in XML Form, aber so in der Art sollen sie auch intern gespeichert werden

vom Prinzip so:


<computer>
<name>pc1</name>
<ip>192.168.1.1</ip>
<hdd>samsung</hdd>
<software>bla</software>
<software>bla02</software>
</computer>

<computer>
<name>pc2</name>
<ip>192.168.1.2</ip>
<hdd>WD</hdd>
<software>bla</software>
<software>bla02</software>
</computer>

Bekomm ich das so mit List abgebildet?

Vielen Dank

06.12.2011 - 19:42 Uhr

Hallo,

folgendes, ich lade verschiedene Daten wie Name, IP, CPU usw. von PC's in meinem Netzwerk und möchte diese gerne temporär während der Laufzeit des Programms speichern.
Anschließend eventuell in XML exportieren oder in eine SQL Datenbank.

Ich habe irgendetwas im Hinterkopf, dass es eine Art temporäre Datenbank in C# gibt, welche ich dafür nutzen kann.

Die Daten müssen nicht sichtbar sein, es reicht wenn ich mit meinem code darauf zugreifen kann.

11.02.2011 - 15:50 Uhr

Danke so funktioniert es.

Ja es hapert definitiv an den Grundlagen. Leider hab ich bis jetzt noch nichts wirklich erklärendes Gefunden, was die Tiefen der Grundlagen erklärt 😉

Evtl. hast du einen Tip?
Trotzdem danke und schönes Wochenende.

11.02.2011 - 15:30 Uhr

Das funktioniert so leider nicht ganz, da ich noch weitere WHERE Bedingungen habe,

hier einmal das komplette SQL Statement.


SELECT [V_WAC_System_Stammdaten_Mandanten].[Md.-Nr.] AS MandantenNr,[V_WAC_System_Stammdaten_Mandanten].[Kurzname] AS Kurzname, V_WAC_Korg_FV_Mandanten.Pl_Unternehmensart,
V_WAC_Korg_FV_Mandanten.Pl_Vorname AS Vorname, V_WAC_Korg_FV_Mandanten.Pl_Name AS Nachname, 
[V_WAC_System_Stammdaten_Mandanten].[Straße (HA)],[V_WAC_System_Stammdaten_Mandanten].[PlZ (HA)],[V_WAC_System_Stammdaten_Mandanten].[Ort (HA)], [V_WAC_System_Stammdaten_Mandanten].[E-Mail],
vMandanten_FreieFelder.Wert AS FreieFelderWert, vMandanten_FreieFelder.Bezeichnung AS FreieFelderBezeichnung

FROM V_WAC_Korg_FV_Mandanten
INNER JOIN vMandanten_FreieFelder ON vMandanten_FreieFelder.ManNr = V_WAC_Korg_FV_Mandanten.flManNr
INNER JOIN V_WAC_System_Stammdaten_Mandanten ON [V_WAC_System_Stammdaten_Mandanten].[Md.-Nr.] = V_WAC_Korg_FV_Mandanten.flManNr

WHERE 
vMandanten_FreieFelder.nummer = '10' AND V_WAC_System_Stammdaten_Mandanten.[Mandant bis] IS NULL 
AND LEN(<@zustMitarbeiter>)=0 OR V_WAC_System_Stammdaten_Mandanten.[Nr. zust. Mitarbeiter] IN (<@zustMitarbeiter>)

Lasse ich Zeile 12 weg(AND LEN....), erhalte ich nur die Datensätze wo vMandanten_Freifelder.nummer = '10' gesetzt ist. Lasse ich den Teil im Statement, erhalte ich alle Datensätze. D.h. er Ignoriert den FreieFelder Teil.

11.02.2011 - 10:28 Uhr

Hoppla,
ne das geht so ja nicht. Da in der Tabelle ja keine NULL Werte vor kommen.
Sondern der @PARAMETER keinen Wert haben kann.
Evtl. habe ich mich oben falsch ausgedrückt, also sobald der Parameter keinen Wert hat, sollen alle Zeilen der Tabelle ausgegeben werden. Wenn Aber der Parameter Werte hat, sollen nur die entsprechenden Zeilen ausgegeben werden.

11.02.2011 - 10:11 Uhr

Der Beitrag wurde editiert.

11.02.2011 - 09:42 Uhr

Guten Morgen,

ich habe eine Statische SQL Abfrage in einer Anwendung. Die SQL Abfrage kann lediglich über einen Parameter geändert werden, welcher durch den Benutzer bzw. das einzustellende Suchkriterium verändert wird. Und zwar wählt der Benutzer in der Anwendung eine Gruppe aus. GruppeA,GruppeB oder GruppeC. Es sind auch mehrere gleichzeitig möglich.

Die SQL Abfrage sieht derzeit so aus:



SELECT ... FROM Tabelle
WHERE Gruppen IN (@PARAMETER)


D.h. wenn jetzt ein oder mehrere gruppen ausgewählt werden, sieht die Abfrage schlussendlich so aus:
SELECT ... FROM Tabelle WHERE Gruppe IN (GruppeA,GruppeB)

nun möchte ich aber gerne, wenn der Benutzer keine Gruppe auswählt, dass alle Datensätze ausgegeben werden.

Quasi


 If Gruppe=NULL then SELECT ... FROM Tabelle else SELECT .. FROM Tabelle WHERE Gruppe IN (@Parameter) endif


Jemand eine Idee wie ich das mit TSQL bewerkstelligen kann?