Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Borg
Thema: IP vortäuschen
Am im Forum: Netzwerktechnologien

Du kannst einfach einen TCPListener mit der angeforderten Adresse und Port aufmachen. Um den Rest kümmert sich der Stack.

Thema: Double Ungenauigkeit
Am im Forum: Rund um die Programmierung

Das Problem ist ein mathematisches. Du berechnest Werte der Sinus- und Kosinusfunktion nahe der Stelle Pi.
Jetzt ist die Steigung von cos an dieser Stelle null, so dass geringe Abweichungen der Stelle nur geringe Abweichungen des Funktionswertes verursachen.
Im Gegensatz zum Sinus. Dieser hat an der Stelle Pi seine größte Steigung, so dass leicht abweichende Stellen eine große Abweichung des Funktionswertes verursachen.

Da du ja nicht genau mit Pi rechnest, sondern mit dem Näherungswert 3,14159265358979 rechnest, erhältst du (FPU-intern als Extended, 64 Bit Mantisse):

cos 3,14159265358979 = -0,99999999999999999999999999999476
binär: Sign: -1, Exponent: -1, Mantisse: 1x Hidden Bit + 64 gesetzte Bit
beim Berechnen in der FPU fallen zusätzliche Rundungsbits an, diese geben in diesem Fall ein Aufrunden an, daher wird auf [Sign: -1, Exponent: 0, Mantisse: 1x Hidden Bit + 64 gelöschte Bits] gerundet. Dies ergibt genau -1.

sin 3,14159265358979 = 0,0000000000000032384626433832795028841970499567
binär: Sign: +1, Exponent: -49, Mantisse: 1x Hidden Bit + [1101001010110110001...]
Hier bringen aber die internen Rundungsbits keine Veränderung in den MSB der Mantisse. Die Berechnung der ersten Bits der Mantisse von 1*2^(-49) + 1*2^(-50) + 1*2^(-51) liefert rund 3,1e-15, was ja in der Größenordnung deines Fehlers liegt.

Solcherart Probleme kann man nur dadurch beheben, dass man von einem berechnenden System zu einem auswertenden System (also eine Algebrasystem) übergeht, welches intern nicht berechnet, sondern als algrbraischen Ausdruck zusammenfasst.
Ansonsten kann man die Probleme nur umgehen, in dem man die double-Mantisse auf beispielsweise 50 Bit rundet. Leider kann man nicht direkt angeben, auf wieviel Bits gerundet werden soll, daher muss man zuerst die Dezimalstelle des 50. Bits ausrechnen:

// Dezimalstelle ausrechnen
int ValidDigits = (int)Math.Round(Math.Log10(unrounded) - 50 * Math.Log10(2) );
// leider wirft Math.Round eine Exception, wenn Stelle nicht im Intervall [0;15] => anpassen
ValidDigits = (ValidDigits < 0) ? 0 : ((ValidDigits > 15) ? 15 : ValidDigits);
double rounded = Math.Round( unrounded, ValidDigits );

Thema: Sinn und Unsinn von out
Am im Forum: Rund um die Programmierung

@Moooitic: Ich glaube, du hast enorme Schwierigkeiten beim Unterscheiden zwischen das Gleiche und das Selbe.

Ich will mich auch mal an einem Beispielen versuchen.

Nehmen wir einfach mal an, zwei eineiige Zwillinge, die sich vom Aussehen, Ansichten und Absichten nicht unterscheiden, wohnen zusammen.
Sie sind also die Gleichen, nicht aber die Selben, also auch nicht identisch.
Dann gibt es zwei Möglichkeiten, wie sie leben.

1. Sie besitzen genau einen Kleiderschrank, in dem jedes Kleidungsstück genau einmal vorhanden ist. Das bedeutet beide besitzen die selbe Kleidung. Nur einer kann sie gerade anhaben, der andere muss warten oder etwas anderes tragen. => konkurierende Zugriffe

2. Sie besitzen jeder genau einen Kleiderschrank. In jedem befinden sich die gleichen Kleidungsstücke, d.h. insgesamt sind alle doppelt vorhanden und jeder hat von jedem Kleidungsstück ein eigenes Exemplar. Dann gibt es keine konkurierenden Zugriffe, beide können jeden Tag das Gleiche tragen.

Probleme gibt es nur am Waschtag. Entweder wäscht jeder seine Sachen selbst, dann benötigt man aber wieder zwei Waschmaschinen und zwei Wäscheleinen, um einen neuen konkurierenden Zugriff zu unterbinden, oder alle Sachen kommen auf einen Haufen und werden zusammen gewaschen.
Wenn es ihnen jetzt aber nicht egal ist, ob sie ihr eigenes Hemd oder das des Zwillings bekommen, müssen sie eine Methode einführen, den Besitzer eines Kleidungsstück zu identifizieren, zum Beispiel durch Beschreiben des Etiketts. Das bedeutet jedoch, dass sie die Gleichheit ihrer Kleidung durch Einführung eines künstlichen Identifikationsmerkmals aufgeben, um eine Identifikation zu ermöglichen.

Die Einführung der ID hat einen großen Vorteil. Um die Sachen nach dem Waschen zu sortieren, muss ich jetzt nicht jedes Kleidungsstück genau betrachten; Größe, Form, Farbe und Muster brauche ich auch nicht mehr wahrzunehmen; ich brauche auch nicht schauen, wer dieses Kleidungsstück bereits in seinem Schrank hat.
Nein, statt dessen schaue ich einfach aufs Etikett. Und da steht dann, welchem Zwilling es gehört. Fertig.

Und jetzt kommt der wichtige Unterschied zwischen einem Objekt im Speicher und einem Datensatz in einer Datenbank.
Es gibt keine Reihenfolge der Datensätze, das bedeutet, es gibt kein eindeutiges Identifizierungsmerkmal für einen Datensatz von Seiten des DBMS. Um also einen Datensatz zu identifizieren müsste ich also alle Eigenschaften überprüfen. Nur dann brauche ich keine Datenbank. Wenn ich beispielsweise vom Auftrags-Datensatz auf den Erteiler kommen will, müsste ich dann im Auftrag sämtliche Eigenschaften speichern, um ihn sicher identifizieren zu können. Dann kann ich mir die zweite Tabelle aber gleich sparen. Um dieses Problem zu durchbrechen, wird jetzt einfach im Datensatz ein zusätzliches Identifikationsmerkmal eingefügt. In relationalen Datenbanken nennt man dieses primary key.

Objekten im Speicher ist jedoch aufgrund der linearen Struktur der Speicheradressierung bereits ein solches Identifikationsmerkmal mitgegeben: die Adresse des Objekts im Speicher, also die Referenz.
Und so wie per Definition die gleichen primary keys den selben Datensatz beschreiben, beschreiben die gleichen Referenzen das selbe Objekt. In beiden Fällen vergleiche ich auf Identität.
Vergleiche ich hingegen die Felder eines Datensatzes oder eines Objektes mit denen eines anderen Datensatzes bzw. Objektes, so vergleiche ich auf Gleichheit.
Selbst wenn die Objekte in allen ihren Eigenschaften gleich sind, so kann ich dennoch keine Aussage darüber treffen, ob sie auch die selben (also identisch) sind.

Thema: Controlboxen, minimieren und mimimieren/tray
Am im Forum: GUI: Windows-Forms

[Artikel] Custom Window Border für Form's

Thema: Sinn und Unsinn von out
Am im Forum: Rund um die Programmierung

Ich finde es objekt-orientierter, wenn alle Methoden nur auf einem Objekt arbeiten und entsprechend nur ein Objekt zurückgeben.
Prinzipiell macht es ja auch keinen Unterschied, ob ich jetzt verschiedene Variablen bereitstelle, die mir die Methode füllt, oder ob mir die Methode ein Objekt, das alle Rückgabewerte enthält, zurückgibt.
Bei einem out-Wert fällt das auch noch nicht auf. Bei mehreren jedoch ergibt sich ein Verstoß gegen das Gebot der Kapselung, weil zusammengehörige Daten unabhängig gespeichert werden.

Deutlich wird das vielleicht an diesem Beispiel:

public bool ParseIPandPort( string Input, out uint IPAddress, out ushort Port )
// Benutzung:
uint IPAddress; // diese beiden Variablen haben (semantisch) überhaupt nichts
ushort Port; // miteinander zu tun, obwohl sie logisch zusammengehören
if (ParseIPandPort( Input, out IPAddress, out Port ))
{
   // ...
}
Im Gegensatz zu:

public class IPandPort
{
   uint IPAddress;
   ushort Port;
}
public IPandPort ParseIPandPort( string Input )
// Benutzung
IPandPort ipap = ParseIPandPort( Input );
if (ipap != null)
{
   // ...
}

EDIT: Code korrigiert.
EDIT2: Text überarbeitet.

Thema: Sinn und Unsinn von out
Am im Forum: Rund um die Programmierung

Ok, dann poste ich hier noch mal meine PM an Moooitic:

Zitat
Zur Klärung:
Werttypen können auch uninitialisiert benutzt werden, so dass ich einfach das Parse einer "leeren" Instanz aufrufen kann.
Bei Referenztypen muss ich allerdings zwingend einen Konstruktor aufrufen, bevor ich irgendwelche Instanzmethoden aufrufen kann.

Als Code:


struct Werttyp
{
   int val;
   public Referenztyp( int i ) { val = i; }
   public bool Parse( string str ) { // ... }
}

class Referenztyp
{
   int val;
   public Referenztyp( int i ) { val = i; }
   public bool Parse( string str ) { // ... }
}

// Jetzt kann ich den Werttyp so parsen:
Werttyp num1; // deklarieren => Instanz ist uninitialisiert
num1.Parse( myString ); // direkt Wert laden

// Beim Referenztyp muss ich es so machen:
Referenztyp num2 = new Referenztyp(); // deklarieren und initialisieren => Instanz ist initialisiert
num2.Parse( myString );

Der wichtige Unterschied ist also, dass der Referenztyp bereits fertig initialisiert und konstruiert sein muss, bevor ich Instanzmethoden aufrufen kann. Jetzt gibt es aber vielleicht keinen einfachen Konstruktor. Oder er prüft die Parameter. Oder im Konstruktor müssen irgendwelche Ressourcen gebunden werden.
Auf jeden Fall habe ich - falls es mit irgendwelchen Parametern überhaupt gelingt - völlig unnötig die Instanz konstruiert, da sie beim Parse ja wieder ersetzt werden.
Um das zu umgehen, muss man entweder statische Methoden einsetzen, die keine fertige Instanz brauchen, oder Konstruktoren mit verschiedenen Parameterlisten.

Ich ziehe den zweiten Weg vor, allerdings wollte MS wohl keine Konstrukte wie:
int myInt = new int( "1234" );
Außerdem haben wir dort wieder das Problem der Exception bzw. mehrfachen Rückgabewerte.

Thema: [erledigt] DateTime - Feststellen ob Wochenende?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich verstehe jetzt aber nicht, was der Wochentag mit dem Wochenende zu tun hat?

Im Gregorianischen Kalender werden sieben Wochentage, welche natürlich in jeder Sprache ihren eigenen Namen tragen, und ihre Reihenfolge definiert.
Dieser Gregorianischen Kalender wird international als der Standardkalender verwendet. Zusätzlich hat man festgelegt, dass im Gregorianischen Kalender der 1.1. der Beginn eines neuen Jahres ist.
Damit kann man jedem Tag weltweit eindeutig einen Wochentag zuordnen.

Der Kalender kann doch nichts dafür, wenn jetzt ein Staat festlegt, dass beispielsweise jeder Dienstag und Donnerstag frei sein soll. Das ändert weder etwas an den Wochentagen noch am sonstigen Kalender. Höchstens auf dem Druckwerk Kalender würde Dienstage und Donnerstage dann halt rot gedruckt werden...

Wie ich oben schon schrieb, war bis vor ca. 30 Jahren der Wochenbeginn der Sonntag. Dies war selbstverständlich auch beim Programmieren so, und deshalb kommt es, dass in eigentlich jedem Wochentags-Enum der Sontag der erste Tag ist (Index 0) und Samstag der letzte (Index 6). Daran haben sich auch die Microsoft-Programmierer bei der Implementation des DayOfWeek-Enum gehalten.
Mit welchem Tag die Aufzählung beginnt, ist aber völlig egal, wichtig ist nur die Reihenfolge der Tage. Prinzipiell könnte ich auch bei Mittwoch anfangen. Auf jeden Fall liefert mit ( Wert + 1 ) % 7 immer den Wochentag von morgen.

Unabhängig davon, wann jetzt lokal die Woche beginnt oder endet oder wann frei ist.

Thema: Sinn und Unsinn von out
Am im Forum: Rund um die Programmierung

Ich stimme dir prinzipiell zu, allerdings ist die Benutzung einer nicht-statischen Parse-Methode nur für Werttypen (struct) sinnvoll. Bei Referenztypen (class) müsste es dann einen entsprechenden Konstruktor geben.

Thema: Laufwerk sperren/verstecken
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat
also wenn ich das richtig verstehe dann wirft er den device an dieser stelle nicht aus?
Doch tut er.
Aber:
Zitat
es sollen alle AUßER B ausgeworfen werden. Aber so wird B ausgeworfen und H bleibt drinne :-(
Was mich zu der Vermutung brachte, dass eher die Bedingung falsch formuliert bzw. Equals falsch implementiert ist.

Thema: Str2Int - Auf wieviel Arten kommen wir zum Ergebnis
Am im Forum: Rund um die Programmierung

Zitat
Da fällt mir gerade noch eine ein, mit der ich Borgs Lösung im Worst-Case noch schlage:
Ok, damit liegt man zeitlicher wohl noch schlechter.
Allerdings: Deine Lösung führt im Gegensatz zu meiner nicht garantiert zu einer Lösung (wenn es eine gibt).
Es ist sogar möglich, dass der Algorithmus unendlich lange läuft, ohne die Lösung zu finden. Inwiefern man dann noch von einem Algorithmus sprechen kann, ist fraglich...

Thema: [erledigt] DateTime - Feststellen ob Wochenende?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Aus der christlichen Tradition heraus ist der Sonntag ja auch der Beginn einer neuen Woche, so wie die Auferstehung Jesu der Beginn eines neuen Zeitalters war.
In der jüdisch/islamischen Tradition wird aber eine Beziehung zum siebenten Tag der Schöpfungsgeschichte hergestellt, der logischerweise am Ende der Woche liegen muss.
Die Woche beginnt bei beiden mit Sonntag.

Der Begriff Wochenende, den es im Deutschen gar nicht gab, kommt vom englischen Weekend, was als Bezeichnung für den auf der Insel im 19. Jhd eingeführten freien Samstagnachmittag benutzt wurde. Und da Sonntag der Wochenanfang ist, ist Samstagnachmittag logischerweise Wochenende...

Allein die letzten Beiträge sollten bereits deutlich machen, warum Microsoft die Finger vom Wochenende gelassen hat und nur die Wochentage definiert.

EDIT: Bis vor 30 Jahren war auch in Deutschland der Sonntag Wochenanfang. Das änderte sich erst als:

Zitat
Der Montag ist seit dem 1. Januar 1976 als Wochenbeginn genormt (EN28601, ISO 8601 und DIN 1355).
Ansonsten: Siehe auch http://de.wikipedia.org/wiki/Wochenende

Thema: ftp: doppelte ip / netzwerkkarte ignorieren?
Am im Forum: Netzwerktechnologien

Dieses Problem kannst du auf der IP-Ebene nicht lösen.
Dazu musst du ins Ethernet hinabsteigen. Mittels "arp.exe" (Address Resolution Protocol) kannst du dir den Cache von bekannten MAC-Adressen zu IP-Adressen anzeigen lassen.
Dort kannst du auch festlegen, über welchen Adapter welche MAC-Adresse gefunden wird (und daher gesendet).

Allerdings besteht auf IP-Ebene kein Unterschied zwischen den beiden Geräten, daher kannst du sie auf IP-Ebene auch nicht getrennt ansprechen.
genau aus diesem Grund dürfen sich die Geräte keine IP geben (APIPA) bzw. erhalten (DHCP), die im gleichen Netz bereits vergeben ist.
Solange der Admin aber keinen Mist baut und die Geräte auf die gleiche statische IP-Adresse einstellt, ist das Problem eher theoretisch. Falls doch, muss er den Mist auch wieder entsorgen.

Thema: Str2Int - Auf wieviel Arten kommen wir zum Ergebnis
Am im Forum: Rund um die Programmierung

Ich beanspruche hiermit den Erfolg, die wahrscheinlich langsamste Methode gefunden zu haben:

public int Str2Int( string mystring )
{
   string iString = myString.Trim();
   int i = int.MinValue;
   try
   {
      while (i.ToString() != iString)
         checked(i++);
   }
   catch(OverflowException ex)
   {
      throw new FormatException();
   }
   return i;
}

EDIT: checked hinzugefügt.

Thema: [Artikel] Parameter-Übergabemechanismen: call by value vs. call by reference (ref/out)
Am im Forum: Artikel

Zitat
Die TryParse-Methoden sind ein gutes Beispiel für die sinnvolle und oo-konforme Verwendung von out.
Nun ja, soweit würde ich nicht gehen. TryParse hat ja auch bloß das Problem zweier Rückgabewerte.
Prinzipiell sind out-Parameter wirklich (oo-gesehen) überflüssig. Oo wäre es, wenn Parse ein entsprechendes Objekt zurückgibt. Allerdings macht das die Schreibweise oftmals komplizierter.

// statt
int myInt;
if (int.TryParse( myString, myInt))
{
   // ...
}

// müsste man
int.ParseResult ipr = int.Parse( myString );
if (ipr.Successful)
{
   int myInt = ipr.Value;
   // ...
}
// schreiben

Thema: Laufwerk sperren/verstecken
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Was macht das denn:

if(!Equals(device.LogicalDrive,"B:"))
Woher kommt das Equals?

Wieso nicht einfach

if (device.LogicalDrive.ToLower() != "b:")

Thema: DPI abfragen
Am im Forum: Grafik und Sound

Nein, nur Standard.
Allerdings kannst du beim Erstellen der Bitmap doch die Auflösung angeben.
Nun kannst du doch mit deiner geforderten Auflösung die Größe (Pixel²) des Bildes berechnen.

Thema: [erledigt] DateTime - Feststellen ob Wochenende?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

In Ländern mit jüdischem Hintergrund ist der Sabbat der "siebente Tag" aus der Genesis. Dieser beginnt Freitag bei Sonnenuntergang und geht bis Sonnabend Sonnenuntergang. In arabischen (islamischen) Ländern ist das ähnlich (ich gaube, bloß einen Tag früher)

In Ländern mit christlichem Hintergrund ist Sonntag der Tag der Auferstehung Jesu (Ostersonntag) und damit der Beginn der "neuen Ordnung". Dieser ersetzte quasi den Sabbat. Man beachte, dass der Samstag eigentlich ein regulärer Arbeitstag ist.

Nur der Vermischung von jüdischer / christlicher Kultur in den USA (und deren Überschwappen nach Europa) verdanken wir es, dass Samstag (jüdischer 7. Tag, Sabbat) und Sonntag (Auferstehung Jesu) zusammen als Wochenende bezeichnet werden und wir daher (seit ca. 20/30 Jahren) praktisch nur fünf Wochentage haben.
Der Samstag bleibt aber weiterhin Wochen- und Arbeitstag.

In anderen Religionen (Buddhismus, Hinduismus etc.) ist das Konzept des Ruhetages unbekannt. Dort gibt es also kein eigentliches Wochenende, sondern nur dass vom Westen erzwungene.

Insofern ist die Entscheidung Microsofts, die religiöse Komponente der Ruhetage nicht in das Framework zu integrieren, durchaus nachvollziehbar.

Wann jetzt Wochenende ist, kann oftmals gar nicht so sicher bestimmt werden.
In Deutschland ist gesetzlich nur der Sonntag Wochenende, praktisch jedoch auch der Samstag. Was sollte man jetzt ins Framework aufnehmen?

Thema: Anwendung für Systemsteuerung
Am im Forum: GUI: Windows-Forms

http://msdn2.microsoft.com/en-us/library/aa969284.aspx

Thema: webBrowser Schwierigkeiten
Am im Forum: GUI: Windows-Forms

Auch wenn du "file:///" davor schreibst?

Thema: Uhrzeit einstellen unter Vista
Am im Forum: Rund um die Programmierung

Was gibt denn SetSystemTime sowie GetLastError zurück?

Thema: GetHashCode
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

0. Im Normalfall müssen Daten an ihrer Größe entsprechenden Speicheradressen ausgerichtet werden. Ein Byte (8Bit) also an Byte-Grenzen (jede Adresse), ein Word (16Bit) an Word-Grenzen (nur gerade Adressen), ein DWord (32Bit) an DWord-Grenzen (durch vier teilbare Adressen) etc.
Der Compiler könnte also deine Strukturen hintereinander im Speicher anordnen, so dass sie 16 respektive 14 Bytes groß sind.
Da du Byte-Werte hast, bringt auch eine Veränderung der Struktur eigentlich nichts, so dass der Compiler dort also nichts optimieren sollte.
Mehr Kontrolle hast du über das Attribut StructLayout.

1. Da du sie als Struct deklarierst, benötigen sie genau so viel Speicher, wie die enthaltenen Daten. Es kann allerdings mehr werden, wenn der Compiler die Reihenfolge der Struktur umsortiert, um wie unter 0. beschrieben zu optimieren.

2. Ich verwende in solchen Fällen immer die XOR-Verknüpfung der Hashes der involvierten Daten.

3. Je nach dem, was du brauchst. Ich empfehle noch ICloneable und IConvertible, wenn es Sinn macht.

Thema: Uhrzeit einstellen unter Vista
Am im Forum: Rund um die Programmierung

Such mal nach User Account Control (UAC).

Thema: Bandlaufwerke
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hast du schon mal NTBackup probiert?
(Start\Ausführen\ntbackup.exe oder Start\Programme\Zubehör\Systemprogramme\Sicherung)

Und wenn du dann immer noch etwas derartiges selbst programmieren willst, weißt du immerhin schon, dass es prinzipiell funktioniert.

Thema: Uhrzeit einstellen unter Vista
Am im Forum: Rund um die Programmierung

Das kann Windows doch auch allein, wenn du unter "Eigenschaften von Datum und Uhrzeit" unter Internetzeit als Server ptbtime1.ptb.de oder ptbtime2.ptb.de einträgst (Dialoge von XP, Vista sicherlich ähnlich).

Thema: MD5 ist tot was kommt jetzt?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

1. salted, englisch, past participle von to salt, salzen
2. http://de.wikipedia.org/wiki/Salted_Hash

Thema: Double Ungenauigkeit
Am im Forum: Rund um die Programmierung

Der Thread trägt genau den richtigen Titel: Double Ungenauigkeit.
Du hast im Double-Format nun mal nur 53Bit für die Mantisse zur Verfügung. Und eine Ungenauigkeit im 53. Bit, wenn das erste den Wert 1 hat (wegen der -1), ergibt nun mal 2^(-52) = 2,22e-16. Dies ist die gleiche Größenordnung, wie deine Abweichung und zeigt uns damit, dass es sich dabei einfach um die zwangsläufig auftretenden Rundungsfehler handelt.
Das ist aber ein prinzipielles Problem von Fließkommazahlen. Die einzige Möglichkeit, so etwas bei der Ausgabe zu unterbinden, ist das Wegrunden der Rundungsfehler. So könnte man davon ausgehen, das nur 10 Dezimalstellen genau wären. Mit einer Stelle vor dem Komma muss man also auf die neunte Nachkommastelle runden.
Danach hätte man genau -1.

Thema: Netzwerk Überwachen
Am im Forum: Web-Technologien

Ich würde das so lösen:

Der Proxy enthält eine ASP.NET Website. Dieser liefert ein kleines HTML-Dokument, was die Buttons "Anmelden" und "Abmelden" sowie eine Uhr enthält. Dieses Dokument bindest du auf den Desktop als Website ein, so dass sie mitten auf dem Desktop angezeigt wird. Dann deaktivierst du den Offline-Modus für diese Website.
Durch Anpassen der Rechte des Registry-Keys HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop\Components sowie der Datei E:\Dokumente und Einstellungen\<<user>>\Anwendungsdaten\Microsoft\Internet Explorer\Desktop.htt (Setzen einer Zugriffsverweigerung für Schreiben, Attribute schreiben, Erweiterte Attribute schreiben sowie Berechtigungen ändern) verhinderst du, dass der Nutzer die Seite entfernt.
Dann braucht deine ASP.Net-Site bloß immer wenn ein An-/Abmeldeereignis kommt, das ganze zu loggen und den Proxy für die IP des Rechners freischalten bzw. sperren.
An der Kasse müssen dann bloß die Rechner-Datensätze ausgelesen, Zeit und Kosten bestimmt werden und die Datensätze danach gelöscht (oder als bearbeitet markiert) werden.

Zu jedem einzelnen Teilproblem findest du hier Lösungen im Forum.

Thema: Fakultät und Binomialkoeffizient
Am im Forum: Rund um die Programmierung

Die Summe machst du mit einer for-Schleife.
Ein größeres Problem sehe ich jedoch bei den Fakultäten. Bereits 13! überschreitet den Zahlbereich von int, 21! den von long. Damit könntest du nur auf BigInts ausweichen, welcher aber wiederum sehr langsam sind.
Die Fließkommatypen sind auch nicht genau genug.

Ich würde mir eine eigene Methode schreiben, welche Zahlen als Dictionary ihrer Faktorpotenzen darstellt. Damit kannst du dann den Binominalkoeffizient durch Kürzen derselben darstellen.

Also:

// Dictionary<Faktor, Potenz>
public Dictionary<int, int> Fakultät( int Zahl )
{
   Dictionary<int,int> intern;
   if (Zahl == 0)
   {
      intern = new Dictionary<int, int>( 0 );
   }
   else
   {
      intern = new Dictionary<int, int>( Zahl );
      for( int i = 1; i ≤ Zahl ; i++ )
      {
         intern[ i ] = 1;
      }
   }
   return intern;
}

// ZusammenfassenModeEnum
public enum ZME : int
{
   Multiplikation = +1;
   Division = -1;
}

public Dictionary<int, int> Zusammenfassen( Dictionary<int, int> Z, Dictionary<int, int> N, ZME Mode )
{
   Dictionary<int, int> intern = new Dictionary<int, int>( Z );
   List<int> nullExponent = new List<int>();
   foreach( KeyValuePair<int, int> kvp in N )
   {
      intern[kvp.Key] = ((intern.ContainsKey(kvp.Key)) ? intern[kvp.Key] : 0 ) + ((int)Mode * kvp.Value);
      if (intern[kvp.Key] == 0)
         nullExponent.Add( kvp.Key );
   }
   // x hoch null entfernen
   foreach( int val in nullExponent )
      intern.Remove( val );
}

public Dictionary<int, int> BinKoeff( int n, int k )
{
   if (k > n)
      throw new ArgumentException( "n ≥ k" );
   // [n über k] = n! / (k! * (n-k!));
   return Zusammenfassen( Fakultät(n), Zusammenfassen(Fakultät(k), Fakultät(n-k), ZME.Multiplikation), ZME.Division );
}

public Dictionary<int, int> Summenterm( int K, int G, int O, int i )
{
   // summenterm = BinKoeff( K - O; i ) * BinKoeff( O; G - i ) / BinKoeff( K; G )
   return Zusammenfassen( Zusammenfassen( BinKoeff( K - O, i ), BinKoeff( O, G - i ), ZME.Multiplikation ), BinKoeff( K, G ), ZME.Division );
}

public double Berechne( Dictionary<int, int> Zahl )
{
   double intern = 1;
   foreach( kvp<int, int> in Zahl)
   {
      intern *= Math.Pow( kvp.Key, kvp.Value );
   }
   return intern;
}

public double BerechneWahrscheinlichkeit( int K, int O, int G )
{
   double intern = 0.0;
   for( int i = 0; i ≤ G - 1; i++ )
   {
      intern += Berechne( Summenterm( K, G, O, i ) );
   }
   return 100*i;
}
Ungetestet, Aufruf per BerechneWahrscheinlichkeit( K, O, G ).

EDIT: Code angepasst

Thema: [CF] serielle Druckeransteuerung ohne Treiber
Am im Forum: Rund um die Programmierung

Ich habe kurz mal HPs Dokumente zu PCL überflogen (PCL 5e Technical Reference Manual Part 1, PCL 5e Technical Reference Manual Part 2; PCL6 ist nicht mit den Vorgängern kompatibel und dort auch nicht dokumentiert) und konnte dort keinerlei Möglichkeit finden, das Alignment einzustellen.

Daher sehe ich nur die Möglichkeit den Cursor zur Startspalte des rechtsbündigen Textes zu verschieben. Da ich allerdings keine Möglichkeit kenne, die Breite eines Textes in druckereigener Proportionalschrift zu ermitteln, musst du entweder auf einen nicht proportionalen Schriftsatz (zumindest für den rechtsbündigen Text) ausweichen, oder du gibst dich mit "ungefähr rechtsbündig" zufrieden - sprich: probierst.

Thema: ServiceProcess Dienst auf fremdem Rechner Fehler
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Du meinst sicherlich die Klasse ServiceController. Einen Namespace als Verwendung anzugeben ist etwas verwirrend.

Da man der ServiceController-Klasse nirgends Credentials mitgeben kann, sehe ich nur die Möglichkeit, dass du dich programmatisch mit Admin$ oder IPC$ auf dem entfernten Rechner verbindest, so dass Nutzername und Kennwort noch im Kennwortspeicher sind.

Um fstzustellen, ob dieser Vorgang überhaupt nötig ist, bietet sich ja die obige Exception an...