Es gibt 2 Arten von Shortcuts: Advertised und Non-Advertised. Und Advertised Shortcuts kann man nicht ändern. Daneben haben solche Shortcuts auch noch den nachteil, dass beim ersten Start vom User nochmals das MSI Paket gebraucht wird. Der User hat aber nicht in allen Fällen Zugriff darauf, und kann somit das Programm noch nicht einmal starten.
Warum Microsoft diesen Weg wählt, weiss ich auch nicht.
Abhilfe jedoch schafft, das MSI kurz mit zB dem Orca Tool ze bearbeiten, und dann in der Property Tabelle den Werten DISABLEADVTSHORTCUTS auf 1 zu setzen.
Hast du dir schon Advanced Installer angeschaut. Die Free Edition unterstützt die Installation vom SQL Server zwar nicht, aber ab der Professional aber dann schon.
Geht das etwas genauer? Was berechnest du gerne genau. Inwiefern stehen Wohnung 1 + 2 mit dem von dir vorgesehenen Kostenfelder zusammer. Wasserverbrauch, Gas usw. sind doch sicherlich wohnungsabhängig. Da kannst doch, nach meinem Verständnis, dafür nicht ein gemeinsames Feld verwenden.
Aber generell würde ich mir eine Kosten-Klasse bauen, mit den Eigenschaften Name, Cost und Interval. Hast du dann mehrere Kosten (wie Gas, Wasser etc.), einfach nur mehrere Instanzen der Kostenklasse in einer Liste ablegen.
Daneben gäbe es eine Wohnung Klasse mit Name, Personen, Fläche, und eben einer List<Kosten> Referenz.
Speichern kanns du z.B. einfach die Wohnung Klasse indem du sie serialisierst. Kuck dir hierzu mal die generische XmlSerializer Klasse an.
Berechnungen würde ich komplett in einer getrennten Klasse auslageren, die als Parameter wahrscheinlich die Wohnung Klasse benötigen wird.
Einfach mal nach "Project Tracking Software/Systems" suchen. Einige Kandidaten wären z.B. Jira...
Jira nutze ich beruflich und sogar auch privat daheim. Für Teams bis zu 10 Leuten kostet das Ganze 10$. Dazu gibt es noch ganz gute Plugins (Greenhopper z.B. für agiles Programmieren)...
Werden es mehr als 10 Leute wird das Ganze allerdings richtig teuer.
Vielleicht zu spät, aber hier noch ein Vorschlag von mir.
Wie wäre es mit der ganzen Binding Sache unter .NET. Gerade so Dinge wie INotifyPropertyChanged Interface können in Verbindung mit den GUI Komponenten schon ziemlich cool rüber kommen.
Es gibt auch virtuelle Imageprinter. Die kannst du als normale Drucker ansteuern, und erstellen dir dann Bilddateien für jede einzelne Seite. Das über Code sauber anzusteuern ist aber sicherlich auch nicht ganz optimal. Aber als Idee wollte ich es aber trotzdem mal in den Raum stellen.
3. Der Kollege mit dem ich telefoniert habe, hat gemeint es würden noch Lizenkosten von 17.000€ kommen.
Da hat dein Kolleger dann aber sicherlich von der Enterprise Version gesprochen. Die sollte eigentlich in den meisten Fällen ein absoluter Overkill sein. Denn um da die Performance rauszuziehen (Clustering etc).) wird auch nochmal eine ebenso teure Hardware vorrausgetzt. Es bringt auch nichts, ein Formel 1 Motor in einen Käfer zu stecken. Da kannst du das Potential nicht ausschöpfen.
Kuck dir unbedingt den Link von Talla an, dort findest du eigentlich alles was man braucht aus erster Hand.
Wie umfangreich ist denn eigentlich deine Software. Von welchem Datenvolumen ist die Rede, wieviele Tabelle ungefähr und für wieviele User ist sie gedacht. Wieviele simultane Zugriffe unterschiedlicher User sind zu erwarten?
keine Auswirkungen mehr hat. Jedenfalls poppt bei mir trotzdem das Windows Fenster auf, um das Update mit Admin Rechten auszuführen. Ich möchte das eigentlich unterbinden.
Das liegt am IIS. Die Probleme hatte ich auch mit klassischen Webservices, und hab die eigentlich immer noch. Das Hochsetzen des Timeouts im IIS hat rein gar nichts bewirkt. Wenn 20 Minuten lang keine Anfrage an den Service kam, hat IIS die Instanz gekillt. Der nächste Client hatte dann Pech und musste 20 Sekunden warten. Ich wusste mir wirklich nicht mehr weiter, und habe letztlich einen blöden Dummy Windows Service laufen, der alle 30 Sekunden eine leere Methode im Webservice aufruft. Dadurch wurde der IIS dann gehindert, nach 20 Minuten die Instanz zu killen.
Das war IIS 6. Wie sich das heute beim IIS 7 verhält, weiss ich nicht.
Aber seitdem meide ich IIS zum Hosten meiner Services, und lagere sie selbst direkt in einem Windows Service ab. Läuft seitdem wesentlich flotter. Liegt aber eher am TCP/IP Binding des WCF Service.
Diese Timeout Geschichte beim IIS kann ich sowieso nicht nachvollziehen. Wenn ich einen Dienst starte, ob IIS oder sonst einer, erwarte ich dass er verfügbar ist, und nicht erst alles neu vorkompiliert werden muss beim ersten Aufruf, nur um serverseitig ein paar Resource zu sparen.
Yes... Das Beispiel leuchtet ein. Das Modell erlaubt also nicht nur eine n:1 Beziehung zwischen Child und Parent, sondern eine n:m (mehrere Parents). Das kann in gewissen Situationen durchaus gefordert sein.
Auch das Umbennen ;-)
Triviales Beispiel: Ein Dateiname enthält einen (Rechtschreib-) Fehler und ein eifriger Mitarbeiter korrigiert das -> die DB wird aber nicht (automatisch) aktualisiert.
Eigentliche alle Operationen am offenen Herzen sind kritisch.
Wenn man wirklich viele solcher Dateien im Filesystem ablegt, tut man gut daran, auch eine Ordnerstruktur einzuführen. Ich hatte mal in der Vergangenheit meine Files einfach in ein Serververzeichnis gepackt. Damals ging es um tägliche Scans. Nach 6 Monaten lagen 50.000 Dateien im Verzeichnis rum. Das macht den Zugriff sicherlich nicht schneller. Also habe ich angefangen, ein Verzeichnis mit dem Jahr anzulegen und 12 Unterverzeichnisse für den Monat. Damit blieb das Ganze überschaubar und auch Backups gestalteten sich wesentlich schlanker... Aber wegen dieser neuen Verzeichnisstruktur kam es dann tatsächlich einmal vor, dass sich ein User kurz verklickt hat und einfach mal so mittels Drag and Drop ein Verzeichnis sonstwo verschoben hat.
Deshalb wiederhol ich mich gern: Operationen am offenen Herzen sind immer kritisch, und die sollte man vermeiden.
Und da ich Verfechter von 3-Tier bin (gfoidl sicher auch :-) ), sollten Zugriffe von Clients nic direkt auf die DB erfolgen oder direkt Zugriff auf das Filesystem haben. Sicherheit kann man dann vergessen und es passieren so Dinge wie oben geschildert. Ausserdem kann ich nicht einfach mal so einen bestimmten Datensatz für eine Benutzer sperren. Auf DB Ebene geht das veilleicht noch, auf Fileebene wirds schon schwieriger.
Wenn also eine 3-Tier Architektur vorliegt, spielt es imho keine Rolle, wo die Blobdaten abgelegt sind, in der DB oder im FS. Erfolgt der Zugriff direkt vom Client auf die DB, würde ich vermutlich alles in die DB packen.
Wieviel Daten fallen denn so im Monat an, und wie gross sind die einzelnen Files durchschnittlich?
danke für den Codeschnippsel. Mir waren die Parameter im DataContractSerializer nicht alle bekannt. So scheint es also zu klappen.
Aber ich frage mich eigentlich, wozu diese Id's im XML benötigt werden? Eigentlich geht doch schon aus der XML Struktur selbst hervor, wer der Parent ist! Ok, du hast die ganzen Child-Nodes nochmals in Children gruppiert, aber der Parent Node ist dem ganzen doch eigentlich übergeordnet.
der XmlSerializer unterstützt keine zyklischen Abhängigkeiten. Mit dem DataContractSerializer wäre das möglich. Falls du den verwenden kannst nimm diesen
Den könnte ich schon verwenden. So direkt ist mir da aber auch nicht bekannt, wie ich dort eine Parent Eigenschaft berücksichtigen kann?
Momentan nutze ich deinen letzten Vorschlag, d.h. nach der Deserialisierung iteriere ich durch meine Collections und setze entsprechend die Parent Eigenschaft. Das find ich aber unschön.
Ich habe ein XML File, mit 2-3 Tiefenebenen. Das Deserialisieren mach ich über die Serialzer Klasse. Das Ergebnis sind dann Klassen mit Unterklassen und Unterunterklassen. Das klappt wunderbar, ist ja auch nix weltberaubendes. Alles was ich brauchte ist eben meine Datenklassen so aufzubauen und mit den XmlAttributen zu versehen, dass das Deserialisieren eben passt (ein xsd Schema liegt mir nicht vor).
Ich habe aber nun das Problem, dass ich die Parent Klasse aus meiner Childklasser heraus brauche. XML Strukturen sind ja immer als Baum zu verstehen, d.h. abgesehen von Root Node haben alle Nodes auch immer einem Parent. Und aus dem Parent Node bräuchte ich aus meiner Childklasse eben die Parentinstanz.
Geht das irgendwie mit Bordmittel beim Deserialisieren oder was muss ich da tun? Ein geeignetes XmlAttribut habe ich dazu jedenfalls nicht gefunden.
Bernd hat dir doch einen Link mit allem Nötigen geschickt. Also wo genau liegt dein Problem. Du hast Connectionstring, du hast deinen Namespace System.Data.SqlClient mit allen nötigen Klassen, und ein Tutorial wie du auf die DB zugreifst. Einziger Unterschied ist, dass es sich um MSSQL und nicht um MySQL wie in Bernds Tutorial handelt.
Die TAN Idess ist gängig in gesicherten IT Systemen. Um sich einzuloggen, braucht man demnach 2 Dinge: Ein Login und Passwort (Wissen) und eine TAN Liste (Haben). Einzeln sind sie nicht zu gebrauchen. D.h. verliere ich meine Liste, kann ein Dritter damit alleine nichts anfangen. Erschnüffelt er mein Passwort (z.B. durch ein Hooktool o.ä.), fehlt ihm die TAN Liste. Das Prinzip des Wissens und Habens. Gänge Systeme, die genau diese Art an Sicherheit bieten sind z.B. Token geschützte VLAN Zugänge (siehe z.B. RSA, und Zertifikate im allgemeinen auch (Hier brauch ich al User mein Zertifikat (Haben) und mein Passwort um es zu nutzen (Wissen)).
Mit diesem Verfahren ist man alleine schon auf der sicheren Seite, dass sich kein Dritter als einen selbst ausgeben kann. Wenn ich mich in ein System einlogge mit meinem Login, Passwort und einmal gültigem TAN, so kann das Gegenüber schons sicher sein, dass es sich tatsächlich um mich handelt. Einzige Möglichkeit wäre den Datenstrom abzufangen, und gar nicht an den Server weiterzuleiten.
Deshalb sollte natürlich die gesamte Verbidnung idealerweise auch noch verschlüsselt sein. Das ist aber nicht in allen Anwendungsfällen überhaupt nötig.
Hängt von ab. Aber um deine User 100% zu authentifizieren, und auch die gesamte kommunikation zu verschlüssen, bleibt dir wohl nur ein Zertifikat übrig.
Wenn die Kommunikation selbst jedoch nicht verschlüsselt zu sein muss, dann gibt es auch andere Möglichkeiten. Passwörter würde ich natürlich nicht im Klartext übermitteln, aber ich dachte da eher an eine Art TAN Liste für deine User, d.h. eine Liste mit Code (z.B. Guids) die nur innerhalb einer Session ihre Gültigkeit haben und danach verfallen... Nur mal so als Idee um dem Murks mit den Zertifikaten aus dem Weg zu gehen.
Für wen soll der Service denn erreichbar sein. Internet oder nur intern. Wenn nur intern, kannst du nicht über Active Directory deine Anwender authentifizieren?
Falls Internet, so besteht der einzige sichere Weg über Zertifikate. Das zu implementieren ist in der Tat nicht trivial. Da hab ich mich ebenfalls schon einmal rangewagt und habs dann irgendwann aufgegeben.
Ich würde eine Installer Klasse in mein Projekt einfügen, dess Aktion beim Installieren des Setups durchgeführt wird. Den gleichen Code kannst du theoretisch auch nutzen, um später aus deinem Programm heraus dein Dialog nochmals aufzurufen.
Aber Vorsicht: Silent Installationen werden somit nicht mehr komplett im Hintergrund durchgeführt.
lag wohl wirklich daran, das FTP und HTTP getrennt waren. Ist mir nicht klar gewesen. Vielleicht könntest du ja in dem neuen Update da irgendwie drauf hinweisen, um dem nächsten User so eine Plackerei zu ersparen
Ich denke, das sollte eigentlich jedem klar sein, oder?
Wenn ich es per FTP irgendwo hochlade, und später über HTTP darauf zugreife, ist doch aber wohl klar dass das nur gehen kann, wenn du auf den gleichen Path auf dem gleichen Server verweist.
Wie ich das sehe gibt es also 3 Möglichkeiten wann ein OnWay Aufruf trotzdem blockieren kann:
[1.]Verbindung zum Client kann nicht hergestellt werden
[2.]Zu grosse Objekte werden zum Client verschickt
[3.]Der Server kann irgendwelche Informationen nicht schnell genug lesen
zu 1.:
Die Verbindung sollte eigentlich stehen, es sei denn es gab mal einen Netzwerkaussetzer o.ä. Das kann natürlich immer mal passieren.
zu 2.: Da ich eigentlich den Client vom Server nur anstupse um ihm mitzuteilen, da ist was das dich interessiert, kann das bei meinen Fällen nicht eintreten
zu 3.: Auch das tritt nicht ein, da ja lediglich ein besseres Ping zum Client geschickt wird.
Punkt 1. kann aber allerdings in der Tat zu einem Problem führen.
Um diesem Problem aus dem Weg zu gehen sind Operationen in meinen Callback Verträge immer mit dem IsOneWay Attribut versehen. Dadurch funktioniert der Server nach dem Prinzip "Fire and Forget". Timeouts treten somit in meinen nicht auf.
Stimmt, so gesehen natürlich völlig nachvollziehbar.
Meine Signatur besagt also letztlich nur, dass ich die Software signiert habe, und sie so dem Kunden gegeben habe. Ein anderer kann ja meine Signatur nicht anhängen, dazu fehlt ihm der private Key und das zugehörige Passwort.
Ich hatte da wohl einen Querdenker
Danke für die Aufklärung
Ich besitze ein Class 2 Zertifikat zum Signieren von EXE, DLL und MSI. Damit ist also der Ursprung der Software beim Kunden als glaubwürdig eingestuft.
Mir ist jetzt aber aufgefallen, dass ich mit meinem Zertifikat nun jede andere bereits VON MIR NICHT signierte Anwendung, also fremde Anwendung, diese Signatur durch die meinige ersetzen kann.
Das kann mir vielleicht mal einer erklären. Somit kann ich doch Software als meine vorgaukeln, obwohl sie gar nicht von mir ist.
Das kann doch aber nicht Sinn und Zweck von digitalen Codesignaturen sein?