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.
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.
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 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.
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.
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?
Zitat
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?
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.
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?
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.
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.
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
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.
Zitat
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.
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.
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.
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.
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?
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.
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.
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.
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.
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:
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
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.
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:
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.
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.
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.
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.
Zitat
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.
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.