das sind alles sachen, die ich noch nie gemacht habe.
Remoting ist gerade thema im MCPD - kurs.
Hast du ein paar ansätze für mich?
ich habe ein Programm, dass über TAPI Nummern wählen kann. PC mit Telefon verbunden.
Nun möchte ich aus unserer Telefonsoftware durch klicken die Nummer an mein Programm senden, da unser Telefonbuch kein C# ist, hab ich mir gedacht ich mache eine Konsolenanwendung mit Args und übergebe die Nummern, dann hab ich alle .Net Mittel diese Nummer an meine Wählprogramm zu seden. und hier kommt dann wohl Remoting oder so in spiel...
ich habe eine kleines Programm das alle Sekunde ein paar PerfornaceCounter ausliest und die Werte in eine Datei schreibt. Brauche das für die Planung einer VM-Welt.
Nun will ich diese Abfrage der Werte auf ca. 85 Servern starten.
Da ich ja die exe nicht remote auf jedem Server starten kann (Sicherheit) würde ich die PerformaceCounter remote abfragen....aber WIE?
Den MachineName kann man angeben aber ich habe keine Berechtigungen die Counter zu lesen.
Wo und wie kann man dort Credentials angeben?
erstmal grüße nach moers...
da war ich vor kurzem auch gerade mal.
also bei uns gibt es sowas leider nicht!
ich finde diese ansätze aber sehr gut und wenn man mal in der staaten guckt zu den großen firmen im silicon valley, da ist sowas auch normal wie zum bsp. auch kindergärten in der firmen.
ich habe vor kurzem einen bericht über google gesehen, da ging es darum, dass den mitarbeitern dort in 20% ihrer zeit 80% der der kretiven lösungen einfallen und deshalb bekommen sie 20% ihrer zeit am tag dafür dinge zu tun, die sie gerne mögen wie zum bsp. basketball spielen.
ich denke, wenn man aufhören würde so eng und stressig zu denken wie es leider hier in deutschland meist der fall, könnte es viel besser laufen!
aber es gibt ja immer nur stress und termine...
wie versprochen hier eine kleine Klasse mit 2 Methoden für die Ermittlung von Freigaben.
System.Management muss referenziert werden.
class ShareLister
{
public List<ManagementObject> ListShares(string computername, string username, string password)
{
List<ManagementObject> Shares = new List<ManagementObject>();
if (computername != string.Empty)
{
ManagementScope managementScope1 = new ManagementScope((@"\\" + computername + @"\root\cimv2"));
managementScope1.Options.Username = username;
managementScope1.Options.Password = password;
managementScope1.Options.EnablePrivileges = true;
ObjectQuery objectQuery1 = new ObjectQuery("SELECT * FROM Win32_Share");
ManagementObjectSearcher managementObjectSearcher1 =
new ManagementObjectSearcher(managementScope1, objectQuery1);
using (ManagementObjectCollection.ManagementObjectEnumerator managementObjectEnumerator1 =
managementObjectSearcher1.Get().GetEnumerator())
{
while (managementObjectEnumerator1.MoveNext())
{
ManagementObject managementObject1 = ((ManagementObject)managementObjectEnumerator1.Current);
Shares.Add(managementObject1);
}
}
}
return Shares;
}
public bool RemoveShare(ManagementObject shareToRemove)
{
try
{
shareToRemove.InvokeMethod("Delete", new object[] { shareToRemove.Path.ToString() });
return true;
}
catch
{
return false;
}
}
}
ist vielleicht nicht sehr elegant aber ich musste das decompilieren und dann nocheinmal etwas aufbessern, da ich meine sourcen nach einem plattenausfall nicht mehr habe... ich weiss -> Backup hilft.... :o(
ich würde den PrinDialog schon vor dem PintPreviewDialog anzeigen lassen, denn für die Vorschau willst du doch auch schon Druckereinstellungen machen (Papier, duplex, nur eine Seite...).
und wenn die PreView auf dem gewählten Drucker OK ist, dann kannst doch normal über den Button drucken.
alles zu druckende in die Print_Page Event des PrinDocuments zeichnen.
und ggf. Parameter im BeginPrint_Event setzen.
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
int xMin = (this.Right - this.Left) - 5;
int xMax = (this.Right - this.Left) + 5;
int xMouse = e.X;
if (xMouse > xMin && xMouse < xMax)
{
//Hier nen Timer laufen lassen und solange der Button
//grdrückt die Größe der Form ändern!
//das ganze dann noch für verschiebungen nach unten machen
}
}
also wenn ich darüber so nachdenke, dann musst du evtl. wenn der MouseButton grdrückt wird gucken, oder der mauszeiger am rand ist und wenn dann die form um die bewegung der maus in die richtung vergößern. das Backgroundimage kannst du doch so einstelllen, dass es sich automatisch vergrößert, autosize oder so...
wenn nicht, musst du dich darum auch noch kümmern...wegen verzerrungen und so.
ich guck mir das gerade mal an...dann poste ich auch code!
ich würde das 1. Modell nehmen.
Programmierer sind doch sooo faul... :o)
nee, spass bei seite, warum soll das frontend das löschen der schüler und noten durchführen. Habe mal gerlernt, dass man soviel funktionalität wie möglich in die DB packen sollte...
Der geschäftsfall heißt "lösche Klasse" und die DB muss dann eben wissen, dass sie eben alle schüler und deren noten löschen muss. das muss doch nicht das fontend wissen, oder?
aber belehrt mich eines besseren!! ist auch für mich eine sehr interessante frage.
ich würde eine Tabelle als DataSource erstellen und das reinpacken was du in dem Grid sehen willst...
DataTable tbl = new DataTable("tblFiles");
tbl.Columns.Add("FullName");
tbl.Columns.Add("Length");
foreach (string file in Directory.GetFiles(@"c:\"))
{
tbl.Rows.Add(new FileInfo(file).FullName, new FileInfo(file).Length.ToString());
}
dateien.DataSource = tbl;
dateien.DataBind();
löschen der Datei kannst du ja dann in einem try catch machen. den fullname in der Datei hast du ja über das FileInfo. kannst im Grid ablegen aber die spalte verstecken, oder legst dir eine liste mit allen dateien ab. wenn das Löschen der Datei erfolgreich war, kann du die zeile aus dem grid löschen.
wie läßt du die dateien denn im grid anzeigen?
also wie kommen deine informationen in das grid?
datasource, datamember?
du solltest dir irgendwo in einer spalte die nicht zu sehen ist den komplenten pfad der datei merken und dann die der löschen methode die datei löschen und dann erst die zeile aus dem grid.
ist erstmal nur eine überlegung. hab ich selbst auch noch nie gemacht...
das kann es nicht sein, bringt kein Unterschied auch wenn du recht hast.
das ist natürlich auch ein fehler meinerseits!!
e.Cancelled ist aber trotzdem immer false, ob ich abbreche oder durchlaufen lasse.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true; // -> default = false!!
backgroundWorker1.WorkerSupportsCancellation = true; // -> defalut = false!!
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
}
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//eine Änderung bei dem Prozess
this.progressBar1.Value = e.ProgressPercentage;
label1.Text = e.UserState.ToString();
}
void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Worker fertig
if (!e.Cancelled) //->hier ist immer false!!
MessageBox.Show("Fertig!");
else
MessageBox.Show("Abbruch!");
}
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//Aufgabe anstoßen
BgTask aLongTask = new BgTask(this.backgroundWorker1);
aLongTask.DoWork();
}
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void button2_Click(object sender, EventArgs e)
{
this.backgroundWorker1.CancelAsync();
//setzt die CancellationPending Property auf true
//muss dann abgefragt werden
}
}
und das was im Hintergrund gemacht wird:
class BgTask
{
private BackgroundWorker _bgWorker;
public BgTask(BackgroundWorker bgWorker)
{
this._bgWorker = bgWorker;
}
public void DoWork()
{
for (int i = 0; i < 100; i++)
{
if (!this._bgWorker.CancellationPending) // abfragen, ob abgebrochen wurde
{
Thread.Sleep(100);
this._bgWorker.ReportProgress(i, i + "x mal gepennt!");
}
else
{
//ggf. aufräumen und Dinge rückgängig machen!
this._bgWorker.ReportProgress(100, "Abgebrochen!");
}
}
}
}