Laden...

Forenbeiträge von *neo* Ingesamt 299 Beiträge

28.04.2023 - 12:42 Uhr

Hallo zusammen,

ich habe mich mal mit dem Thema Appbar auseinandergesetzt. Habe dazu einen einen schönen Beitrag gefunden:

https://www.codeproject.com/Articles/6741/AppBar-using-C

Ich habe es genauso umgesetzt.

Das funktioniert auch wunderbar! Es gibt aber Anwendungen die Rutschen unter die Bar. Z.B. Remote Desktop Connection von Windows und docken nicht an im Vollbild.

Ich habe versucht herauszufinden woran das liegt. Ich weiß aber nicht warum.

Leider konnte ich kein Screenshot machen und musste ein Bild zusammenbauen 😃. So sollte es eigentlich aussehen. Der graue Bereich mit den zwei Buttons ist die Appbar und das Fenster mit der blauen Menüleiste darunter ist das Programm Remote Desktop Connection von Windows.

Aber leider verschwindet die blaue Leiste hinter der Appbar.

Die Appbar ist TopMost. Das soll ja auch so sein und alle anderen Fenster sollen sich unten andocken. Das funktioniert auch mit den meisten Anwendungen.

Ich habe jetzt hier nicht explizit den Quelltext gepostet. Der ist ja oben zu finden unter dem Link.

Danke für eure Unterstützung.

21.03.2023 - 08:00 Uhr

Hallo,

genauso hatte ich es am Anfang, dass hat aber genauso lange gedauert.
Ich muss mit unseren Netzwerkadmins sprechen. Das scheint der Weg über den VPN das Problem zu sein, warum auch immer.

Sehr komisch!

20.03.2023 - 15:01 Uhr

Hallo,

das habe ich falsch beschrieben 🙂. Beim durchlesen eben ist mir das aufgefallen.
Ich möchte natürlich nicht das Passwort. Ich will den User prüfen.
Ich habe das auch hingekommen wie folgt:


PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "DEINE_DOMAIN", "DC=S1,DC=S2", username, password);

GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(principalContext, IdentityType.Name, "gruppeadmin");

if (groupPrincipal != null)
                {
                    foreach (Principal p in groupPrincipal.GetMembers(true))
                    {
                        if (p.Name != null)
                        {
                            if (p.Name.Equals(username))
                            {
                                foundInAdAndGroup = true;
                                break;
                            }
                        }
                    }

                    groupPrincipal.Dispose();
                }

Eigentlich ist das Ziel zu schauen, ist der Benutzer in einer bestimmten Gruppe.

Das funktioniert auch prima!
Heute im Homeoffice über VPN dauert die Anfrage fasst 45 Sekunden. Bei einer 75mbit Leistung.
Ich muss das jetzt morgen noch einmal Vorort testen. Das ging eigentlich ganz schnell!
Das Problem tritt hier auf bei GetMembers(true). Das dauert ewig. In der Gruppe 'gruppeadmin' sind eigentlich nur 3 Personen aktuell!
Hat jemand hier schon mal Erfahrung gemacht.

Danke, grüße

15.03.2023 - 16:41 Uhr

Hallo zusammen,

ich habe versucht, auch mit Hilfe der Beiträge hier, den sAMAccountName aus einem AD zu lesen für einen bestimmten User.
Da ich noch nicht so genau verstehe wie ich den bestimmten User lese. Wollte ich mir erst einmal alle User aus CN=gruppeadmin holen und dann nach einem bestimmten User suchen über eine Schleife.

Ich Poste mal etwas Code für das bessere Verständnis:


DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://SERVERNAME", username, password);
directoryEntry.Path = "LDAP://CN=gruppeadmin,OU=OU2,OU=OU1,DC=S1,DC=S2"; //In cn gruppeadmin sind die User hinterlegt
directoryEntry.AuthenticationType = AuthenticationTypes.Secure;

string[] props = { "sAMAccountName"};
DirectorySearcher search = new DirectorySearcher(directoryEntry, "(&(objectClass=user))", props, System.DirectoryServices.SearchScope.Subtree);

SearchResultCollection resultCol = search.FindAll();
if (resultCol != null)
{
if (resultCol.Count > 0)
{
//hier komme ich gar nicht hin, weil Count == 0
}

}


Ich weiß ehrlich gesagt nicht was ich falsch mache. Der Filter "(&(objectClass=user)) stimmt hier glaub ich nicht.
Variable username, password sind die Daten von dem User den ich im AD suche.
Das ist so gewollte. Der User soll durch Eingabe seiner Anmeldedaten am AD authentifiziert werden und bestimmte Daten erhalten. Daher ist sAMAccountName nur ein Beispiel.

Danke und Grüße

03.03.2023 - 16:10 Uhr

Hallo,

danke für die Antwort.
Ok.
Gibt es denn eine Möglichkeit auf einer Gui Form zu prüfen, ob das Element noch im sichtbaren Bereiches des Users ist, oder ob das Element samt Form über z.B. den rechten Rand des Bildschirms hinausgeht.

Weist du was ich meine?

Grüße

03.03.2023 - 13:00 Uhr

Hallo zusammen,

ich benötige die Skalierung des Bildschirms in Windows.
Dazu lese ich den Wert LogPixels unter HKEY_CURRENT_USER\Control Panel\Desktop aus.
Wenn ich den Wert in den Bildschirmeinstellungen ändere dann ändert sich aber der Wert nicht.
Ist das die falsche Stelle?
Ich weiß es gibt noch andere Methoden um die Skalierung zu erhalten. Die Anwendung ist jedoch alt und basiert auf einer 2er Dot net Version.

Danke und Grüße

01.12.2021 - 11:22 Uhr

Hallo zusammen,

so, jetzt habt ihr mich maximal verwirrt 🙂

Es kommt eine Meldung dass das Framework nicht installiert ist und eine Abfrage ob es installiert werden soll.

Ab welcher Windows Version, oder war das bezogen auf Win 10?

Nun muss man noch beachten, wie .NET funktioniert: es gibt Side by Side Versionen und In Place Upgrades.
.NET 2, .NET 3.5 und .NET 4 sind Side by Side Installationen.
Wenn man .NET 4.6 installiert, dann bleiben .NET 2 und .NET 3.5 unberührt; es wird nur .NET 4 auf 4.6 aktualisiert.

Wenn ich heute einen Windows 10 Rechner kaufe scheint .Net 4.6 oder höher installiert zu sein, so habe ich es verstanden.
Alle darunter liegenden Versionen wie 2.0 oder 3.5 sind doch dann nicht installiert. Dennoch scheint eine Applikation die unter .Net 2 geschrieben wurde auch zu laufen. Oder ist dann auf den Rechner alle vorhanden Versionen unter z.B. .Net 4.6 installiert?

Grüße

30.11.2021 - 14:49 Uhr

Hallo zusammen,

danke für die inhaltsreichen Antworten.

@glandorf

wenn die Applikation mit .NET Framework 2 erstellt ist, muss in den Windows Features eventuell die Unterstützung aktiviert werden.

Führt das zu einem sichtbaren Fehler, wie beim komplett fehlenden Framenwork oder stürzt die Anwendung dann einfach ab?

@Abt
Ok, verstehe. Eigentlich ging es mir auch nur um das fehlende Framenwork, ob das ab Win 10 überall vorinstalliert ist und mich über die die Installation nicht mehr drum kümmern muss. So wie ich das jetzt gesehen habe unter den Links von oben und euch auch verstanden habe, ist das ja der Fall.

Grüße

26.11.2021 - 11:53 Uhr

Hallo Gü,

das Gesicht kenne ich noch aus früheren Zeiten hier im Forum 🙂
Danke schon mal vorab für deine Antwort!

Der zweite Link gibt mir glaube ich die korrekt Auskunft.
Dort unter "Supported client operating systems" ist folgende Spalte vorhanden "Preinstalled with the OS"
Das müsste doch die Auskunft sein. Das heißt doch für mich, wenn der User Win 10 hat, hat er AUFJEDENFALL die .net Version 4.6 - 4.8, je nach Update?
Wenn das Vorinstalliert ist, kann man das dann deinstallieren?
Ich sehe da auch unter Win 7 gab es keine Vorinstallation. Deshalb gab es das damals bei mir nicht und ich musste mich selbst um die das Vorhandensein kümmern.

Unter dem ersten Link habe ich folgendes rauslesen können:
Hab aber gelesen, dass man alte Applikationen mit dem Framework 2 nicht unbedingt migrieren muss und diese dann unter einer höheren Framework Version auch laufen. Man soll nur neue Applikationen mit dem neuen Framework erstellen.

Für mich heißt das eigentlich das ich mir um das Vorhandensein des Frameworks keine Gedanken mehr machen muss, wenn die Applikation auf einem Windows 10 Rechner laufen soll, auch wenn diese mit dem Framework 2 programmiert wurde.

Ist mein Verständnis von diesen Ausführungen richtig?

Danke und Grüße

25.11.2021 - 16:48 Uhr

Guten Tag zusammen,

ich bin ca. seit 7 Jahren nicht mehr am C# Programmieren. Jetzt habe ich wieder ein Projekt und habe folgende Frage.
Früher war es so, dass man über den Installer z.B Inno abgefragt hat ob das .Net Framework installiert war, weil sonst nach dem Start über die EXE ne Fehlermeldung kam.
Wie ist das unter Windows 10, 11 mittlerweile. Laut Internet ist das Framework immer mit installiert, also bei jeder Neuinstallation, außer auf einer Server Windows Variante. Stimmt das? Das würde ja heißen man muss sich darum nicht mehr kümmern.

Grüße

08.08.2016 - 08:00 Uhr

Guten Morgen zusammen,

wir haben jetzt die Rückmeldung, dass das tasächlich das Problem war.
Wir werden das ändern. Kann man das Global ihrgend wie mitgeben für das geamte Projekt, oder geht das nur darüber es bei jedem Parse oder TryParse mitzugeben? Global zuzuordnen scheint nicht zu gehen, die Attribute sind ja schreibgeschützt.

Grüße

05.08.2016 - 20:47 Uhr

Hallo,

ich hab jetzt durch ein Analysetool herrausgefunden das folgendes auf dem System des Kunden leer ist: System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.LongDatePattern
Bei uns wird da das angezeigt: dddd, d. MMMM yyyy

Was kann das sein?

04.08.2016 - 15:00 Uhr

Hallo,

ich bin auch davon ausgegangen, dass die Windows Version keinen Unterschied macht. Doch leider ist es scheinbar so. Das Problem trat erst nach dem Update auf.

Aber um ganz sicher zu gehen, kannst Du diese Infos doch explizit mit geben?
Für global gültige Daten würde ich CultureInfo.InvariantCulture verwenden.
Dann sind auch die Einstellungen im Windows egal.

Da müsste ich ja das ganze Projekt durchsuchen und Änderungen vornehmen. Puhh. Ich hab gehofft das das über Windows lösbar ist.

Das Projekt läuft unter .Net 2.0. Ich schau mir eure Tipps morgen mal an.

grüße

04.08.2016 - 10:19 Uhr

Hallo zusammen,

ich habe ein komisches Problem. Ich habe von einem Kunden eine Rückmeldung bekommen, dass nach dem Update von Windows 8.1 auf Windows 10 er den Lizenzschlüssel nicht mehr verwenden kann. Die Stelle an der die Exception auftritt kenne ich. Dort wird mittels Parse und Tryparse Daten (Mehrzahl Datum) geprüft. Die Exception kenne ich leider nicht genau, weil der Kollege das in eine allgemeine Fehlermeldung abfängt.

Meine Forschungen ergaben jetzt, dass wenn ein System in einer anderen Sprache läuft wo z.B. das Zeitformat nicht hh:mm ist sondern z.b. hh.mm. Aber das trifft nicht zu. In dem System ist die Ländereinstellung Deutsch laut Kunde.

Hat jemand das schon gehabt?

Wir haben mehrere Kunden mit Windows 10.

Grüße

02.02.2015 - 11:50 Uhr

das ist grundsätzlich auch ne gute Idee.

weiß jemand wie ich den Adminkontext unterbrechen kann? Wie gsagt mit process.StartInfo.Verb = ""; kann ich es leider nicht zurücksetzten 😦

Grüße

02.02.2015 - 08:31 Uhr

Hallo zusammen,

grundsätzlich habt ihr Recht. Die Anwendung ist aber nicht auf meinem Mist gewachsen und hat leider Fehler im Design. Wir verscuhen das zu ändern.

Grundsätzlich habe ich erst einmal herausgefunden wie ich einen Prozess als Administrator starte:

process.StartInfo.Verb = "runas";

Soweit so gut, der neue Prozess startet auch mit Adminrechten.
Wenn ich in diesem Prozess erneut eine Prozess/Exe startet wird dieser auch automatisch mit Adminrechten gestartet. Gewollt ist aber, dass dieser dann nicht mehr im Adminmodus läuft.
Ich habe dazu folgendes probiert:

process.StartInfo.Verb = "";

Ging aber leider nicht 😃

Die Berechtigung scheint weitergetragen zu werden.

Grüße

01.02.2015 - 10:15 Uhr

Hallo herbivore,

ist ist mir grundsätzlich klar,dass ich den Updater unter Adminrechte starten kann, aber die Hauptanwendung lädt ja schon die neuen dateien runter, daran scheichtert es ja. Deshalb müsste ich sogar die Hauptanwendung mit Adminrechten starten.

Wenn alles über den Updater passieren würde, dann hättest du natürlich recht.

Meine Idee ist jetzt, dass ich pürfe ob der aktuelle User in das Programmverzeichnis schreiben kann. WEnn nicht, werde ich einen Dialog anzeigen, der zeigt wie man die Software komplett im Adminmodus starten kann für das Update.

Das ist leider keine schöne Lösung.

Grüße

01.02.2015 - 01:27 Uhr

Hallo,

klar ist das richtig so, mein Problem ist nur, dass ich in der Hauptanwendung die neuen Dateien für mein Update herunterlade und diese in einem Temp verzeichnis im Programmordner ablege. Danach wird die Hauptanwendung geschlossen und es kommt ein zusätzliches Updateprogramm welches die neuen Dateien über die alten kopiert, also auch Schreibberechtigungen braucht. Nach dem das passiert ist startet wieder die Hauptanwendung und löscht die alten Dateien im Programmordner.

Somit müsste ich die Hauptanwendung auch immer im Adminmodus starten und das will ich eigentlich nicht.

Mmmmm. Gibt es da bessere Lösungsansätze als jetzt meinen Ansatz?

Grüße

01.02.2015 - 00:27 Uhr

Hallo zusammen,

ich habe folgendes Problem.
Ich möchte gerne ein Programm unter Adminrechten starten. Grundsätzlich muss dazu scheinbar eine Manifest-Datei mit folgenden Inhalt erstellt werden.


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0"  name="someProgram.exe" type="win32"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

Dazu habe ich das Zusatzprogramm mt.exe verwendet mit folgendem Befehl:

C:\>c:\Users\xxx\Desktop\mt.exe -manifest c:\Users\xxx\Desktop\someProgram.exe
.manifest -outputresource:C:\Users\xxx\Desktop\someProgram.exe

Wenn ich die Exe jetzt starte wird mir der Dialog zur Benutzerkontesteuerung angezeigt. Ich hatte eigentlich gedacht, dass das dann nicht passiert, aber dann habe ich gemerkt, dass das gleiche passiert wenn ich rechte Maustaste->Als Administrator ausführen klicke.

Kann man das ihrgendwie abstellen?

Ich möchte grundsätzlich ja die UAC nicht aushebeln, aber ich möchte ein Update bauen und prüfen in Hauptanwendung ob ich unter Programme schreiben darf um die neuen Programmdateien abzulegen. Evtl. kann man das vielleicht noch anders lösen. Dann würde ich mich freuen über ein paar Tipss.

Güße

24.01.2015 - 13:35 Uhr

Hallo,

ich könnte mir grundsätzlich natürlich noch eine Eigenschaft bauen, dass ist richtig. Müsste aber bei jedem Aufruf diese Eigenschaft vorher füllen. Da ich an dem Projekt nicht jede Stelle ansteuern will um die Änderung einzufügen, hatte ich mir gedacht, dass ich in der WndProc Methode prüfe durch was die Items eingefügt werden.

Grüße

24.01.2015 - 09:59 Uhr

Hallo,

ich habe mir eine eigene Listview gebaut.
Ich müsste in der Methode

protected override void WndProc(ref Message msg)

herrausfinden ob das Item mittels Add oder AddRange eingefügt wurden. In beiden Fällen wird die Methode WndProc pro Item aufgerufen egal ob Add oder AddRange. Da ich unterschiedliche Behandlungen durchführen muss muss ich einen Unterschied erkennen ob das Item mittes Add oder AddRange eingefügt wurde.

Grüße und danke

30.12.2014 - 14:33 Uhr

Hallo,

ich habe es tatsächlich so gelöst, dass ich ein Rechteck gezeichnet habe und darunter gelegt habe


e.Graphics.DrawRectangle(new Pen(new SolidBrush(System.Drawing.SystemColors.Control)), new Rectangle(new Point(e.Item.SubItems[0].Bounds.X - 2, e.Item.SubItems[0].Bounds.Y - 1), new Size(e.Item.SubItems[1].Bounds.Width, e.Item.SubItems[0].Bounds.Height)));

Grüße und Danke

29.12.2014 - 21:33 Uhr

Hallo,

ich habe die Eigenschaft OwnerDraw an einer Listview aktiviert und habe jeweils die folgenden Methoden implementiert. Ziel iet es bestimmte Zeilen slbst du zeichen, die im Tag einen Wert drin stehen haben. das klappt auch soweit gut. Hier die Methoden:


private void ListView_DrawItem(object sender, DrawListViewItemEventArgs e)
{
	if (e.Item.Tag == null)
	{
		e.DrawDefault = true;
	}
}

private void ListView_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
   e.DrawDefault = true;
}

private void ListView_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{

	for (int i = 0; i < e.Item.SubItems.Count; i++)
	{
		if (e.ItemIndex % 2 != 0)
		{
			e.Item.SubItems[i].BackColor = Color.Red;
			e.Item.SubItems[i].ForeColor = System.Drawing.SystemColors.WindowText;
		}
		else
		{
			e.Item.SubItems[i].BackColor = System.Drawing.SystemColors.Window;
			e.Item.SubItems[i].ForeColor = System.Drawing.SystemColors.WindowText;
		}
	}

	if (e.ColumnIndex == 0)
	{
		if (e.Item.Tag == null)
		{
			CheckBoxRenderer.DrawCheckBox(e.Graphics, new Point(e.Item.Bounds.X + 4, e.Item.Bounds.Y + 2), System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal);
		}

		e.DrawBackground();

		e.Graphics.DrawImage (((MainForm)this.Owner).getImageList ().Images [((MainForm)this.Owner).getImageList ().Images.IndexOfKey (e.Item.Tag.ToString())], new Point (e.Item.Bounds.X + 19, e.Item.Bounds.Y));

		e.Graphics.DrawString(e.Item.Text, e.Item.Font, Brushes.Black, new Point(e.Item.Bounds.X + 36, e.Item.Bounds.Y + 2));
	}
	else
	{
		e.DrawDefault = true;
	}
}

Das Ergebis daraus seht ihr im Anhang.

Bestimmte Zeilen, je nach Füllung des Tag, zeiche ich mit der ListView_DrawSubItem Methode. Dabei fällt auf, dass das erste Subitem den kompletten Hintergrund mit rosa befüllt hat, und bei allen anderen Zeilen sind das erste Subitem norma, also nicht komplett gefülltl.

Scheinbar wir im Standard der Hintergrund anders gezeichnet. Ich habe eigentlich gedacht dass ich mit e.DrawBackground(); das ich damit den Hintergrund des ersten Subitem auch so Zeichne wie im Standard.

Haben ich einen Denkfehler?

Beim Bild bedeutet:
1 = mein eigen gezeichneten Zeile
2 = Standard Zeile

Grüße

18.12.2014 - 14:53 Uhr

Hallo,

ich habe folgendes Problem.
Ich möchte gerne den Inhalt einer Anlage auslesen um diesen als byte-Array an eine Schnittstelle in SAP zu übergeben. Mein Problem ist, dass ich es nicht hinbekomme an den Inhalt des Attachments zu kommen ohne die Datei zwischenzuspeichern. Dies muss aber vermieden werden aus Datenschutzgründen.

Hat einer eine Idee?

Grüße und Danke

04.06.2014 - 12:58 Uhr

Hallo,

ich bin so blöd!

Ich habe das Projekt übernommen von einem Kollegen der weg ist. Jetzt beim nachstellen einer neuen Menüleiste habe ich gemerkt das es geht und mich gefragt was da schief läuft. Im Quelltext habe ich dann folgendes gefunden:

((ToolStripDropDownMenu)importierenToolStripMenuItem.DropDown).ShowImageMargin = false;

Sorry, das hätte ich sehen müssen! Schande über mein Haupt! Wie war das mit dem Wald 😃

Grüße

04.06.2014 - 12:24 Uhr

Hallo herbivore,

ja, genau, es ist gar kein Platz da um es darzustellen.

subSubMenu.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;

hat leider auch keien Abwechselung gebracht.

Ist ihrgend wie komisch. Ich verzuche jetzt mal noch ein neue Projekt zu erstellen und das ganze dynamisch zu generieren.

Grüße

04.06.2014 - 10:43 Uhr

Hallo herbivore,

danke für die schnelle Antwort!

Anbei der Code:


this.importToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.importCSVToolStripMenuItem,
this.importTXTToolStripMenuItem,
this.importInitalCounterstatesToolStripMenuItem});
this.importToolStripMenuItem.Image = global::ProjektX.Properties.Resources.import;
this.importToolStripMenuItem.Name = "importToolStripMenuItem";
this.importToolStripMenuItem.Size = new System.Drawing.Size(235, 22);
this.importToolStripMenuItem.Text = "&Importieren";

this.importCSVToolStripMenuItem.Image = global::ProjektX.Properties.Resources.CSV;
this.importCSVToolStripMenuItem.Name = "importCSVToolStripMenuItem";
this.importCSVToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.importCSVToolStripMenuItem.Text = "CSV";
this.importCSVToolStripMenuItem.Click += new System.EventHandler(this.importCSVToolStripMenuItem_Click);

Die Icons habe ich auch schon zwischen Menü und Submenü getauscht. Funktionieren im direkten Menü super.

Anbei noch ein Bild von der Darstellung.

Danke und Grüße

04.06.2014 - 08:36 Uhr

Hallo zusammen,

ich habe ein Menü in folgender Form


Speichern
Speichern unter ...
Importieren         | CSV
                    | TXT

Die Pipe | steht für ein Untermenü.

Das Problem ist folgendes. Dem Menüpunkt Importieren, habe ich ein Image als Menüicon hinzugefügt. Dieses wird auch angezeigt. Bei den Untermenüpunkten CSV und TXT habe ich auch jeweils ein Icon hinterlegt, welches NICHT angezeigt wird.

Grüße und danke

21.02.2014 - 20:04 Uhr

Hallo,

ich weiß was der Unterschied zwischen Verschlüsselung und Hashwert ist 😃

Ich habe mir den Header angeschaut. Dort werden so oder so ähnlich die Daten aufgebaut:

Authorization: Digest username="xxx", realm="abc", nonce="T9ICNeRjBAA=4fbb28d42db044e182116ac27176e81d067a313c", uri="/www.domain.de/", algorithm=MD5, response="33f29dcc5d70b61be18eaddfca9bd601", qop=auth, nc=00000001, cnonce="ab96bbe39d8d776d"

Natürlich ist MD5 nicht mehr hundert Prozentig sicher, jedoch stellt sich da die Frage, und der Meinung war mein Prof auch immer, welcher Aufwand rechtfertig die Mittel. Digest ist wahrscheinlich dennoch besser als Basic. Da gibst du mir wahrscheinlich auch Recht.

Mir ging es wirklich nur darum, dass ich mich gewundert habe, dass ich von Basic einfach auf Digest wechseln konnte ohne Programmanpassung. Sondern der Quelltext oben, von mir, einfach funktioniert hat.

Danke

21.02.2014 - 16:18 Uhr

Hallo,

noch ein Hinweis. Mir ist auch vollkommen bewusst, dass die Parameter im Klartext über die Leitung gehen wenn man nicht selbst tätig wird, egal ob Basic oder Digest. Diese haben wir bereits programmiertechnisch verschlüsselt.

Grüße

21.02.2014 - 15:39 Uhr

Hallo,

aber genau dieses MSDN Beispiel hat mich verunsichert. Digest ist doch extra dafür, dass die Anmeldedaten nicht im Klartext übermittelt werden sondern in Kombination mit weiteren Merkmalen ein MD5 erstellt und an den Server gesendet wird.

Beim Zugriff auf ein mit Auth-Digest geschütztes Verzeichnis sendet der Webserver zusätzlich zur angeforderten Authentifizierung eine zufällig erzeugte Zeichen-Kombination. Der Browser fragt nun wie gehabt zuerst den User nach Benutzername und Passwort. Nun wird vom Browser eine Zeichenfolge erstellt welche aus Username, Passwort, angesurfter URL, der HTTP-Methode sowie der vom Webserver übermittelten zufälligen Zeichen-Kombination besteht. Von dieser zusammengesetzten Zeichenfolge wird nun ein (meist MD5-) Hash erzeugt und zum Webserver geschickt. Der Webserver wiederum macht genau das Selbe wie der Browser, bildet also die zusammengesetzte Zeichenfolge und den Hash daraus. Stimmt der vom Browser übermittelte Hash mit dem vom Server berechneten überein, ist der User Authentifiziert und erhält Zugriff. Bei jedem neuen Request wiederholt sich der Vorgang mit einer neuen zufälligen Zeichen-Kombination und damit einer neuen Zeichenfolge und neuem Hash.

Quelle hier..

Das heißt für mich dass meine Anfrage an den Server dazu führt, dass ich die besagte Zeichenkette bekomme und .Net demensprechend handelt und den MD5 baut und zurück gibt, wenn .Net sich an die Definition hält.

Implementiert .Net dieses Verfahren so nicht?

Ich verstehe, dass der Eindruck entstanden ist, das ich mich nicht mit dem Thema beschäftigt habe. Dem ist aber nicht so, wie meine Frage hier zeigt.

Grüße und Danke

21.02.2014 - 10:18 Uhr

Hallo,

sorry, wenn ich das selbst so lese, geb ich dir Recht 😃

Meine Frage ist, ob etwas besonderes beachtet werden muss wenn ich umstelle auf Digest. Ob ich dem Header noch etwas mitgeben muss oder ihrgend welche Eigenschaften noch beim Request setzte muss.

Grüße und Danke

21.02.2014 - 10:07 Uhr

Hallo,

bisher hat es bei unseren Kunden ausgereicht Serververzeichnisse mit Htaccess Basic zu "schützen". Für den Zugriff haben wir folgendes verwendet:


ServicePointManager.Expect100Continue = false;

HttpWebRequest httpWebRequestForLogin = (HttpWebRequest)WebRequest.Create(url);

if (!proxy.Equals(""))
{
	httpWebRequestForLogin.Proxy = new WebProxy(proxy);
	httpWebRequestForLogin.Proxy.Credentials = new NetworkCredential(benutzername_proxy, passwort_proxy); //proxy anmeleddaten
}
else
{
	httpWebRequestForLogin.Proxy = new WebProxy();
}

byte[] parameterByteArray = Encoding.GetEncoding("ISO-8859-1").GetBytes("p1=test&p2=test2");

httpWebRequestForLogin.Credentials = new NetworkCredential(benutzernamea_htaccess, passwort_htaccess); //anmeldedaten htaccess
httpWebRequestForLogin.KeepAlive = false;
httpWebRequestForLogin.ContentType = "application/x-www-form-urlencoded";
httpWebRequestForLogin.Method = "POST";
httpWebRequestForLogin.ContentLength = parameterByteArray.Length;

Stream requestStream = httpWebRequestForLogin.GetRequestStream();
requestStream.Write(parameterByteArray, 0, parameterByteArray.Length);
requestStream.Close();

HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequestForLogin.GetResponse();
StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.ASCII);
String result = streamReader.ReadToEnd();

Jetzt möchte aber ein anderer Kunde Htaccess Digest eingesetzt haben.

Ich habe jetzt gesucht ob man etwas besonderes in C# beachten muss. Z.B den Header explizit setzten. Ich Java muss man das unter Umstanden machen, so wie ich es gelesen habe.

Wie wir die .htaccess und .htpass Datei erstellen wissen wir und haben wir auch schon gemacht. Mit dem Quelltext oben funktioniert auch der Zugriff auf das Verzeichnis. Mich wundert es, dass man nicht extra die Art der Authentifizierung mitgeben muss, also Basic oder Digest.

Grüße und Danke

12.02.2014 - 16:39 Uhr

Hallo Abt,

vielen, vielen dank für deinen Link. hat mir super geholfen. Anbei noch die encrypt methode in Java:



cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
algorithmParameterSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, algorithmParameterSpec);
byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
return new String(Base64.encode(encrypted, Base64.DEFAULT), "UTF-8");

Grüße

12.02.2014 - 13:59 Uhr

Hallo zusammen,

ich habe folgenden Code in Java


public AESCrypt(String key) throws Exception {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        digest.update(key.getBytes("UTF-8"));
        byte[] keyBytes = new byte[32];
        System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);

        cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
        AlgorithmParameterSpec spec = getIV();
    }

public AlgorithmParameterSpec getIV() {
        byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
        IvParameterSpec ivParameterSpec;
        ivParameterSpec = new IvParameterSpec(iv);

        return ivParameterSpec;
    }

    public String encrypt(String plainText) throws Exception {
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, spec);
        byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
        String encryptedText = new String(Base64.encode(encrypted, Base64.DEFAULT), "UTF-8");

        return encryptedText;
    }

in C# folgendes:


RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;

rijndaelCipher.KeySize = 128;
rijndaelCipher.BlockSize = 128;

HashAlgorithm sha = new SHA256Managed();
byte[] pwdBytes = Encoding.UTF8.GetBytes(key);
byte[] test = sha.ComputeHash(pwdBytes);

byte[] keyBytes = new byte[32];

Array.Copy(test, keyBytes, Math.Min(keyBytes.Length, pwdBytes.Length));
rijndaelCipher.Key = keyBytes;
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
rijndaelCipher.IV = iv;
ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
byte[] plainText = Encoding.UTF8.GetBytes(textToEncrypt);

return Convert.ToBase64String(transform.TransformFinalBlock(plainText, 0, plainText.Length));

unter Java bekomme ich folgenden base64 String raus:
PrbaDKPFyLNzBA6LtCnx/w==

und unter c#:
zvDdhGAn7D+Ahs6IWKowAg==

Ich verstehe nicht woran es liegt.
Zur Info in PHP habe ich auch den base64 String PrbaDKPFyLNzBA6LtCnx/w== herrausbekommen. In C# fehlt etwas oder ist falsch.

Danke für eure Hilfe

28.11.2013 - 13:35 Uhr

Hallo,

leider muss ich nach so langer Zeit berichten, dass Anwendungen die mit Yano obfuscatiert wurden bei Kaspersky als generischen Trojaner erkannt werden.

Ich kann es nicht hundert Prozent sagen das es so ist, weil ich auch Invoke verwende und das scheinbar auch manchmal dazu führt, aber ich schätze es mal.

Grüße

07.10.2013 - 11:37 Uhr

Hallo,

ich habe was dazu gefunden unter internetsetoption (wininet)

Jedoch ist mir nicht ganz klar, ob die Änderungen evt. nur temporär sind, d.h. solange das Programm/die Form angezeigt wird. Weil wenn ich den Code ausführe, wird ein Proxy gesetzt. Ich sehe das daran, dass die gewünschte Seite im WebControl aufgerufen wird. Wenn ich jedoch gleichzeiitig in die IE Einstellungen gehe oder in die Reg, um zu prüfen was gerade gesetzt ist, sehe ich diese neue Änderung nicht. Grundsätzlich ist das Verhalten für mich OK. Jedoch möchte ich ja nach dem ich die Seite aufgerufen habe, die alten Proxyeinstellungen, vor meiner Änderung, wieder herstellen. Das ist auch kein Problem, könnte ich mir ja ihrgend wo merken bzw aus der Reg aulesen, ABER wenn das nur temporär ist muss ich ja nicht zurücksetzten, oder?

Grüße und Danke

04.10.2013 - 18:52 Uhr

Hallo zusammen,

ich muss den Thread leider noch einmal aufwärmen.

Ich habe leider jetzt die Anforderungen, dass ich bei:


sendWebBrowser.Navigate(new Uri("http://" + proxyUsername + ":" + proxyPasswort + "@www.domaine.de");

nicht nur die Anmelddaten mitgeben muss sondern auch die
Proxy Informationen wie Server und Port, weil diese im IE nicht hinterlegt werden sollen.

Leider hat mein erneuter Versuch mittels Request wieder nicht funktioniert:


byte[] parameterByteArray = Encoding.GetEncoding("ISO-8859-1").GetBytes("test=X");
HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri("http:www.test.php"));
CookieContainer cookies = new CookieContainer();
myRequest.CookieContainer = cookies;
myRequest.Proxy = new WebProxy(proxy);
myRequest.AllowAutoRedirect = true;
myRequest.Proxy.Credentials = new NetworkCredential(proxyUsername, proxyPasswort);
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = parameterByteArray.Length;
myRequest.Method = "POST";
Stream dataStream = myRequest.GetRequestStream();
dataStream.Write(parameterByteArray, 0, parameterByteArray.Length);
dataStream.Close();

HttpWebResponse response = (HttpWebResponse)myRequest.GetResponse();
webBrowser.DocumentStream = response .GetResponseStream();

Ich erhalte zwar Daten dass sehe ich daran, dass wenn ich mir den Quelltext anzeigen lasse dieser auch vorhanden ist. Aber das WebBrowser-Controll nichts anzeigt!

Wenn ich das gleiche Dokument ohne notwendige Proxydaten nur über Navigate aufrufe geht es (Natürlich wenn die Server-Daten im IE hinterlegt sind). Somit scheint es nicht an der PHP Seite selbst zu liegen.

Hat jemand eine Idee?

Grüße und Danke

07.08.2013 - 14:40 Uhr

Hallo,

abschließend hier mein Ergebnis:


[Flags()]
enum SLGP_FLAGS
{
	/// <summary>Retrieves the standard short (8.3 format) file name</summary>
	SLGP_SHORTPATH = 0x1,
	/// <summary>Retrieves the Universal Naming Convention (UNC) path name of the file</summary>
	SLGP_UNCPRIORITY = 0x2,
	/// <summary>Retrieves the raw path name. A raw path is something that might not exist and may include environment variables that need to be expanded</summary>
	SLGP_RAWPATH = 0x4
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
struct WIN32_FIND_DATAW
{
	public uint dwFileAttributes;
	public long ftCreationTime;
	public long ftLastAccessTime;
	public long ftLastWriteTime;
	public uint nFileSizeHigh;
	public uint nFileSizeLow;
	public uint dwReserved0;
	public uint dwReserved1;
	[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
	public string cFileName;
	[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
	public string cAlternateFileName;
}

[Flags()]
enum SLR_FLAGS
{
	/// <summary>
	/// Do not display a dialog box if the link cannot be resolved. When SLR_NO_UI is set,
	/// the high-order word of fFlags can be set to a time-out value that specifies the
	/// maximum amount of time to be spent resolving the link. The function returns if the
	/// link cannot be resolved within the time-out duration. If the high-order word is set
	/// to zero, the time-out duration will be set to the default value of 3,000 milliseconds
	/// (3 seconds). To specify a value, set the high word of fFlags to the desired time-out
	/// duration, in milliseconds.
	/// </summary>
	SLR_NO_UI = 0x1,
	/// <summary>Obsolete and no longer used</summary>
	SLR_ANY_MATCH = 0x2,
	/// <summary>If the link object has changed, update its path and list of identifiers.
	/// If SLR_UPDATE is set, you do not need to call IPersistFile::IsDirty to determine
	/// whether or not the link object has changed.</summary>
	SLR_UPDATE = 0x4,
	/// <summary>Do not update the link information</summary>
	SLR_NOUPDATE = 0x8,
	/// <summary>Do not execute the search heuristics</summary>
	SLR_NOSEARCH = 0x10,
	/// <summary>Do not use distributed link tracking</summary>
	SLR_NOTRACK = 0x20,
	/// <summary>Disable distributed link tracking. By default, distributed link tracking tracks
	/// removable media across multiple devices based on the volume name. It also uses the
	/// Universal Naming Convention (UNC) path to track remote file systems whose drive letter
	/// has changed. Setting SLR_NOLINKINFO disables both types of tracking.</summary>
	SLR_NOLINKINFO = 0x40,
	/// <summary>Call the Microsoft Windows Installer</summary>
	SLR_INVOKE_MSI = 0x80
}


/// <summary>The IShellLink interface allows Shell links to be created, modified, and resolved</summary>
[ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("000214F9-0000-0000-C000-000000000046")]
interface IShellLinkW
{
	/// <summary>Retrieves the path and file name of a Shell link object</summary>
	void GetPath([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out WIN32_FIND_DATAW pfd, SLGP_FLAGS fFlags);
	/// <summary>Retrieves the list of item identifiers for a Shell link object</summary>
	void GetIDList(out IntPtr ppidl);
	/// <summary>Sets the pointer to an item identifier list (PIDL) for a Shell link object.</summary>
	void SetIDList(IntPtr pidl);
	/// <summary>Retrieves the description string for a Shell link object</summary>
	void GetDescription([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName);
	/// <summary>Sets the description for a Shell link object. The description can be any application-defined string</summary>
	void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);
	/// <summary>Retrieves the name of the working directory for a Shell link object</summary>
	void GetWorkingDirectory([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath);
	/// <summary>Sets the name of the working directory for a Shell link object</summary>
	void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);
	/// <summary>Retrieves the command-line arguments associated with a Shell link object</summary>
	void GetArguments([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath);
	/// <summary>Sets the command-line arguments for a Shell link object</summary>
	void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);
	/// <summary>Retrieves the hot key for a Shell link object</summary>
	void GetHotkey(out short pwHotkey);
	/// <summary>Sets a hot key for a Shell link object</summary>
	void SetHotkey(short wHotkey);
	/// <summary>Retrieves the show command for a Shell link object</summary>
	void GetShowCmd(out int piShowCmd);
	/// <summary>Sets the show command for a Shell link object. The show command sets the initial show state of the window.</summary>
	void SetShowCmd(int iShowCmd);
	/// <summary>Retrieves the location (path and index) of the icon for a Shell link object</summary>
	void GetIconLocation([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath,
		int cchIconPath, out int piIcon);
	/// <summary>Sets the location (path and index) of the icon for a Shell link object</summary>
	void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);
	/// <summary>Sets the relative path to the Shell link object</summary>
	void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved);
	/// <summary>Attempts to find the target of a Shell link, even if it has been moved or renamed</summary>
	void Resolve(IntPtr hwnd, SLR_FLAGS fFlags);
	/// <summary>Sets the path and file name of a Shell link object</summary>
	void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);

}

[ComImport, Guid("0000010c-0000-0000-c000-000000000046"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPersist
{
	[PreserveSig]
	void GetClassID(out Guid pClassID);
}


[ComImport, Guid("0000010b-0000-0000-C000-000000000046"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPersistFile : IPersist
{
	new void GetClassID(out Guid pClassID);
	[PreserveSig]
	int IsDirty();

	[PreserveSig]
	void Load([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName, uint dwMode);

	[PreserveSig]
	void Save([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName,
		[In, MarshalAs(UnmanagedType.Bool)] bool fRemember);

	[PreserveSig]
	void SaveCompleted([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName);

	[PreserveSig]
	void GetCurFile([In, MarshalAs(UnmanagedType.LPWStr)] string ppszFileName);
}

const uint STGM_READ = 0;
const int MAX_PATH = 260;

// CLSID_ShellLink from ShlGuid.h 
[
	ComImport(),
	Guid("00021401-0000-0000-C000-000000000046")
]
public class ShellLink
{
}

/// <summary>
/// 
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public static String getLinkedPath(String filename)
{
	ShellLink link = new ShellLink();

	((IPersistFile)link).Load(filename, STGM_READ);

	StringBuilder stringBuilder = new StringBuilder(MAX_PATH);

	WIN32_FIND_DATAW data = new WIN32_FIND_DATAW();

	((IShellLinkW)link).GetPath(stringBuilder, stringBuilder.Capacity, out data, 0);

	return stringBuilder.ToString();
}

Damit habe ich das Ziel der Verknüpfung erhalten.

Vielen Dank an alle für die Hilfe und den langen Atem 😃

Grüße

06.08.2013 - 17:23 Uhr

Hi,

ich habe jetzt folgendes gefunden How to resolve a .lnk in c#

das funktioniert einfach so 😃 Zumindest liefert es mir den Pfad zur Datei.

Ich schau es mir morgen noch in Ruhe an.

Grüße

06.08.2013 - 16:29 Uhr

Hallo,

ok, dass habe ich verstanden. Das wusste ich nicht. Bisher sind wir mit den Standard ganz gut gefahren. Dennoch muss ich sagen, dass ein direkter Verweis auf eine System DDL nix bringt, wenn ich Sie nicht mal ausliefern darf. Was bringt es mir dann diese in diese Verweise zu setzten?

Dann fällt ja ILMerge aus 😃

Gut, dann noch DLLImport. Mein Problem dabei ist, den Ansatzpunkt zu finden und zu suchen. Die bisherigen Beispiel haben mir gezeigt, dass nach dem DLL Import eine Static Methode deklariert wird die wiederum in einer Methode in der Form aufgerufen wird. Beim Problem ist wie finde ich die richtige Methode für das genannte Problem oben. Ich muss im Endeffekt das Abbilden mittels DLLImport:


Shell32.ShellClass Shell = new Shell32.ShellClass();
Shell32.Folder Ordner = Shell.NameSpace(Path.GetDirectoryName(file));
Shell32.FolderItem Datei = Ordner.Items().Item(Path.GetFileName(file));
Shell32.ShellLinkObject Verk = (Shell32.ShellLinkObject)Datei.GetLink;
string Link_Path = Verk.Path;

Ich versuche mich Morgen mal einzulesen.

Grüße

06.08.2013 - 15:46 Uhr

Hallo,

aber was ist den der Unterschied, ob ich eine Windows DLL einbinde mittels ILMerge, per eingebette Ressource oder diese direkt mit in meinen Programmordner ausliefere? Wäre das dann auch nicht erlaubt? So wäre das ja auch bei dem von mir am Anfang geschilderten Ausgangslage. Ich binde die DLL als Verweis ein und erstelle meine EXE. Diese wird dann mit der DLL ausgeliefert. Das dürfte ich ja laut deiner Aussage dann nicht.

Grüße

06.08.2013 - 12:56 Uhr

Hallo,

zu dem DLLImport. Damit kam ich jetzt auf die schnell nicht zurecht.

Grüße

06.08.2013 - 12:55 Uhr

Hallo,

ich hab mir jetzt mal ILMerge angeschaut.
Ich denke ich werde das in Zukunft damit machen. Ich hab jetzt leider nicht genau lesen können ob dieses Tool auch auf kommenzielle Anwendungen angewendet werden darf. Das scheint mir die besser Lösung zu sein, als das durch Boradmittel zu erledigen.

DLL in exe einbinden

Gibt es da Nachteile bei der Verwendung? Habt ihr da Erfahrung?

Grüße

06.08.2013 - 11:37 Uhr

Hallo

Mich würde mal interessieren, warum diese
DLL für Euch so schlimm ist.

Unsere Kunden möchten das so.

Grüße

06.08.2013 - 11:24 Uhr

Hallo,

ich hatte ja einen Link gepostet wo eine Möglichkeit aufgezeigt wird, mittels InvokeMethod. Und dort komme ich bis zum Folderitem aber den Link erhalte ich nicht mit

Call(folderItem, "GetLink", new Object[] { });

klappt es nicht.

Ich muss mir mal anschauen wie das mit DllImport geht. Habe ich bisher noch nicht gemacht.

Grüße

06.08.2013 - 10:40 Uhr

Hallo,

Du kannst auch im Solution Explorer die Datei in dein Projekt hinzufügen und bei den Eigenschaften die Option "Copy to Output Directory" auf "Copy always" setzen.

ich will ja das die App ohne die dll funktioniert. Dass ist mein Ziel.

Ich hat jetzt mal folgenden Link probiert: shell-api-uber-dllimport-hinzufugen aber das komm ich nicht weiter, weil ich den den pfad nicht bekomme.

Grüße

06.08.2013 - 08:35 Uhr

Hallo,

die Interop.Shell32.dll entsteht ja aus dem compiling der inkludierten shell32.dll. Deshalb zielte meine Frage zuerst auf die shell32.dll ab.

Grüße

06.08.2013 - 07:46 Uhr

Hallo herbivore,

ich habe es genauso gemacht wie im Link beschrieben. Habe die Dll aus dem System32 Ordner per Verweis eingebunden und folgendes implementiert:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Shell32;
using System.IO;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        string file = "";

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ShellClass Shell = new ShellClass();
            Folder myFolder = Shell.NameSpace(Path.GetDirectoryName(file));
            FolderItem myFolderItem = myFolder.Items().Item(Path.GetFileName(file));
            ShellLinkObject myShellLinkObject = (ShellLinkObject)myFolderItem.GetLink;
            string filePath = myShellLinkObject.Path;

        }

        private void Form1_DragDrop(object sender, DragEventArgs e)
        {
            string[] FileList = (string[])e.Data.GetData(DataFormats.FileDrop, false);
            foreach (string File in FileList)
            {
                this.file = File;
            }
        }

        private void Form1_DragEnter(object sender, DragEventArgs e)
        {

            if (e.Data.GetDataPresent(DataFormats.FileDrop))
                e.Effect = DragDropEffects.Copy;
            else
                e.Effect = DragDropEffects.None;
        }
    }
}

Wenn ich nur die erstelle Exe der Anwendung in einen Ordner ziehe wo keine Interop.Shell32.dll liegt, erhalte ich den Fehler:

Fehlermeldung:
System.IO.FileNotFoundException: Die Datei oder Assembly "Interop.Shell32, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.
Dateiname: "Interop.Shell32, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"

Muss ich noch was einstellen?

Grüße und Danke

05.08.2013 - 19:44 Uhr

Hi,

ja,ich meinte LNK. War gerade auf dem Sprung deshalb 😃

D. h. ich muss die shell32.dll mit ins Programmverzeichnis ausliefern?

Gibt es noch andere technische Möglichkeiten?

Grüße