Laden...

Profil von Sykwitit

myCSharp.de - Member Mitglied seit

Alle Beiträge

Danke für deine Verbeserungen. Ich habe Sie eingebaut und habe jetzt auch den Fehler gefunden.

Aus replaceDate = lastDayOfMonth.ToString("dd MMMM yyyy"); wurde replaceDate = lastDayOfMonth.ToString("dd. MMMM yyyy");

Da der String falsch weitergegeben wurde, hat Word das Datum nicht übernommen. Jetzt druckt er mir zB von Jänner bis Juni alles richtig aus. Zumindest als PDF. Am Drucker muss ich es testen, ob irgendein Fehler gibt.

public void LastDate2()
        {
            string filePath = @"C:\EtikettenVorlage.docm";
            string searchText = "LOT 15";
            string replaceText = txtbxStart.Text;
            string replaceEndString = txtbxStop.Text;
            string searchDate = "31. August 2026";
            int Seiten = Convert.ToInt32(txtbxAnzahl.Text);
            string replaceDate = dateTimePicker.Text;
            Word.Application wordApp = null;
            Word.Document doc = null;

            try
            {
                // 1. Word Anwendung starten
                wordApp = new Word.Application();
                wordApp.Visible = true;
                progressBar.Value = 10;

                // 2. Dokument öffnen
                object file = filePath;
                object nul = Type.Missing;
                doc = wordApp.Documents.Open(ref file, ref nul, ref nul,
                ref nul, ref nul, ref nul, ref nul, ref nul,
                ref nul, ref nul, ref nul, ref nul, ref nul,
                ref nul, ref nul, ref nul);
                Statuslabel.Text = "Dokument wird geöffnet...";
                progressBar.Value = 20;
                doc.Application.Run("AutoExec");

                DateTime startDate = dateTimePicker.Value;
                DateTime endDate = startDate.AddMonths(Convert.ToInt32(txtbxStop.Text));

                // Iteration durch den Datumsbereich
                for (DateTime date = startDate; date <= endDate; date = date.AddMonths(1))
                {
                    // Berechne den letzten Tag des aktuellen Monats
                    DateTime lastDayOfMonth = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
                    
                    replaceDate = lastDayOfMonth.ToString("dd. MMMM yyyy");
                    replaceText = "0";

                        // 3. Gesamten Inhalt auswählen
                        doc.Content.Select();
                        Statuslabel.Text = "Dokument wird gelesen...";
                        progressBar.Value = 30;

                        // 4. Suchen und Ersetzen für LOT Wert
                        Word.Find findObject = wordApp.Selection.Find;
                        findObject.ClearFormatting();
                        findObject.Text = searchText;
                        findObject.Replacement.ClearFormatting();
                        findObject.Replacement.Text = "LOT 15";
                        Statuslabel.Text = "LOT wird gesucht...";
                        progressBar.Value = 40;

                        // Replace-Parameter richtig setzen für LOT Wert
                        findObject.Execute(
                        FindText: searchText,
                        ReplaceWith: "",
                        Replace: Word.WdReplace.wdReplaceAll);
                        Statuslabel.Text = "LOT wird gesucht und Entfernt...";
                        progressBar.Value = 50;

                        //ReplaceDatum
                        Word.Find findDate = wordApp.Selection.Find;
                        findDate.ClearFormatting();
                        findDate.Text = searchDate;
                        findDate.Replacement.ClearFormatting();
                        findDate.Replacement.Text = replaceDate;
                        Statuslabel.Text = "Datum wird gesucht...";
                        progressBar.Value = 60;

                        // Replace-Parameter richtig setzen
                        findDate.Execute(
                        FindText: searchDate,
                        ReplaceWith: replaceDate,
                        Replace: Word.WdReplace.wdReplaceAll);
                        Statuslabel.Text = "Datum wird gesucht und Ersetzt...";
                        progressBar.Value = 70;

                        // 5. Dokument speichern und schließen
                        wordApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;

                        TimeSpan time = new TimeSpan(800);
                        
                        doc.PrintOut(20, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Seiten); 
                        Statuslabel.Text = "Es wird gedruckt...";
                        progressBar.Value = 80;

                    
                    Word.Find findDateBack = wordApp.Selection.Find;
                    findDate.ClearFormatting();
                    findDate.Text = replaceDate;
                    findDate.Replacement.ClearFormatting();
                    findDate.Replacement.Text = searchDate;
                    Statuslabel.Text = "Datum zurücksetzen...";
                    progressBar.Value = 60;

                    findDateBack.Execute(
                        FindText: replaceDate,
                        ReplaceWith: searchDate,
                       Replace: Word.WdReplace.wdReplaceAll);
                    
                    object saveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;                    
                    doc.Close(SaveChanges: Word.WdSaveOptions.wdDoNotSaveChanges);
                    wordApp.Quit(saveChanges, ref nul, ref nul);
                    progressBar.Value = 90;
                    Statuslabel.Text = "Fertig";
                    progressBar.Value = 100;                   
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }                
        }

Habe es korrigiert und es läuft bis auf einen Fehler:

Wenn das erste mal das Datum ersetzt wird, funktioniert es beim 2. mal nicht mehr.

Also wenn das Datum auf Jänner gesetzt wird, wird beim nächsten durchlauf die Variable auf Februar gesetzt, aber es wird im Word Dokument nicht ersetzt.

public void LastDate2()
        {
            int year = dateTimePicker.Value.Year;
            int month = dateTimePicker.Value.Month;
            int day = dateTimePicker.Value.Day;

            string filePath = @"C:\EtikettenVorlage.docm";
            string searchText = "LOT 15";
            string replaceText = txtbxStart.Text;
            string replaceEndString = txtbxStop.Text;
            string searchDate = "31. August 2026";
            int Seiten = Convert.ToInt16(txtbxAnzahl.Text);
            string replaceDate = dateTimePicker.Text;
            Word.Application wordApp = null;
            Word.Document doc = null;

            try
            {
                // 1. Word Anwendung starten
                wordApp = new Word.Application();
                wordApp.Visible = true;
                progressBar.Value = 10;

                // 2. Dokument öffnen
                object file = filePath;
                object nul = Type.Missing;
                doc = wordApp.Documents.Open(ref file, ref nul, ref nul,
                ref nul, ref nul, ref nul, ref nul, ref nul,
                ref nul, ref nul, ref nul, ref nul, ref nul,
                ref nul, ref nul, ref nul);
                Statuslabel.Text = "Dokument wird geöffnet...";
                progressBar.Value = 20;
                doc.Application.Run("AutoExec");
                               
                DateTime startDate = new DateTime(year, month, day);
                DateTime endDate = new DateTime(year, month + Convert.ToInt32(Seiten), day); //Seiten=Anzahl der Monate

                // Iteration durch den Datumsbereich
                for (DateTime date = startDate; date <= endDate; date = date.AddMonths(1))
                {
                    // Berechne den letzten Tag des aktuellen Monats
                    DateTime lastDayOfMonth = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
                    dateTimePicker.Value = DateTime.Parse(lastDayOfMonth.ToString("dd MMMM yyyy"));
                    replaceDate = dateTimePicker.Text;
                    replaceText = "0";

                        // 3. Gesamten Inhalt auswählen
                        doc.Content.Select();
                        Statuslabel.Text = "Dokument wird gelesen...";
                        progressBar.Value = 30;

                        // 4. Suchen und Ersetzen für LOT Wert
                        Word.Find findObject = wordApp.Selection.Find;
                        findObject.ClearFormatting();
                        findObject.Text = searchText;
                        findObject.Replacement.ClearFormatting();
                        findObject.Replacement.Text = "LOT 15";
                        Statuslabel.Text = "LOT wird gesucht...";
                        progressBar.Value = 40;

                        // Replace-Parameter richtig setzen für LOT Wert
                        findObject.Execute(
                        FindText: searchText,
                        ReplaceWith: "",
                        Replace: Word.WdReplace.wdReplaceAll);
                        Statuslabel.Text = "LOT wird gesucht und Entfernt...";
                        progressBar.Value = 50;

                        //ReplaceDatum
                        Word.Find findDate = wordApp.Selection.Find;
                        findDate.ClearFormatting();
                        findDate.Text = searchDate;
                        findDate.Replacement.ClearFormatting();
                        findDate.Replacement.Text = replaceDate;
                        Statuslabel.Text = "Datum wird gesucht...";
                        progressBar.Value = 60;

                        // Replace-Parameter richtig setzen
                        findDate.Execute(
                        FindText: searchDate,
                        ReplaceWith: replaceDate,
                        Replace: Word.WdReplace.wdReplaceAll);
                        Statuslabel.Text = "Datum wird gesucht und Ersetzt...";
                        progressBar.Value = 70;

                        // 5. Dokument speichern und schließen
                        wordApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;

                        TimeSpan time = new TimeSpan(800);
                        //doc.Application.Run("AutoExec"); //Deaktiviert die Meldung und Druckt das Dokument aus
                        doc.PrintOut(20, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Seiten); //Seiten ist die Anzahl wie viele gedruckt wird
                        Statuslabel.Text = "Es wird gedruckt...";
                        progressBar.Value = 80;

                    TimeSpan time2 = new TimeSpan(800);
                    searchDate = "31. August 2026";
                    //Setzt den aktuelle Datum auf August 26 zurück, damit die Suche wieder von vorne beginnen kann - HIER ist auch irgendwie der Fehler. Das Datum wird in Word nicht zurückgesetzt
                    Word.Find findDateBack = wordApp.Selection.Find;
                    findDate.ClearFormatting();
                    findDate.Text = replaceDate;
                    findDate.Replacement.ClearFormatting();
                    findDate.Replacement.Text = searchDate;
                    Statuslabel.Text = "Datum wird gesucht...";
                    progressBar.Value = 60;

                    findDateBack.Execute(
                        FindText: replaceDate,
                        ReplaceWith: searchDate,
                       Replace: Word.WdReplace.wdReplaceAll);

                    //}
                    object saveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
                    //doc.SaveAs2("Print.docx", ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul);
                    //doc.Close(SaveChanges: Word.WdSaveOptions.wdDoNotSaveChanges);
                    //wordApp.Quit(saveChanges, ref nul, ref nul);
                    progressBar.Value = 90;
                    Statuslabel.Text = "Fertig";
                    progressBar.Value = 100;
                   
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }                
        }

Bin da etwas weiter, aber Microsoft Word sagt, dass das Format falsch ist:

        public void LastDate()
        {
            string replaceDate = dateTimePicker.Value.ToString();
            int year = Convert.ToInt32(replaceDate.Substring(6,4));
            int month = Convert.ToInt32(replaceDate.Substring(3,2));
            int day = Convert.ToInt32(replaceDate.Substring(0, 2));
            //
            string filePath = @"C:\EtikettenVorlage.docm";
            string searchString = "LOT 15";
            string replaceString = txtbxStart.Text;
            string replaceEndString = txtbxStop.Text;
            string searchDate = "31. August 2026";
            int Seiten = Convert.ToInt16(txtbxAnzahl.Text);
            //string replaceDate = dateTimePicker.Text;
            //

            string temporarydate = "";
            DateTime startDate = new DateTime(year, month, day);// 2025, 06,23);
            DateTime endDate = new DateTime(year, month+2, day);

            // Iteration durch den Datumsbereich
            for (DateTime date = startDate; date <= endDate; date = date.AddMonths(1))
            {
                // Berechne den letzten Tag des aktuellen Monats
                DateTime lastDayOfMonth = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
                MessageBox.Show(lastDayOfMonth.ToString("dd.MMMM yyyy"));
                dateTimePicker.Value = lastDayOfMonth;
                temporarydate = Convert.ToString(dateTimePicker.Value.ToString("dd.MMMM yyyy"));                
                ReplaceTextInWordDocument3(filePath, searchString, replaceString, searchDate, temporarydate, Seiten);

            }

Ich möchte meinen code um eine Funktion erweitern, der mir den letzten Tag im Monat anzeigt

lastDayOfMonth.ToString("dd.MM.yyyy");

ist im Prinzip ein long(DateTIme). Ich brauche aber ein string, damit ich es an die Methode weiterleiten kann.

Wie kann ich DateTime in ein String umwandeln? MitConvert.ToString(lastDayOfMonth.ToString("dd.MM.yyyy"));

bekomme ich bei temporarydate nicht das Datum sondern nur ""

public void LastDate()
        {
            string replaceDate = dateTimePicker.Value.ToString();
            int year = Convert.ToInt32(replaceDate.Substring(6,4));
            int month = Convert.ToInt32(replaceDate.Substring(3,2));
            int day = Convert.ToInt32(replaceDate.Substring(0, 2));
            //
            string filePath = @"C:\Vorlage.docm";
            string searchString = "LOT 15";
            string replaceString = txtbxStart.Text;
            string replaceEndString = txtbxStop.Text;
            string searchDate = "31. August 2026";
            int Seiten = Convert.ToInt16(txtbxAnzahl.Text);
            //string replaceDate = dateTimePicker.Text;
            //

            string temporarydate = "";
            DateTime startDate = new DateTime(year, month, day);// 2025, 06,23);
            DateTime endDate = new DateTime(year, month+2, day);

            // Iteration durch den Datumsbereich
            for (DateTime date = startDate; date <= endDate; date = date.AddMonths(1))
            {
                // Berechne den letzten Tag des aktuellen Monats
                DateTime lastDayOfMonth = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
                MessageBox.Show(lastDayOfMonth.ToString("dd.MM.yyyy"));
                temporarydate = lastDayOfMonth.ToString("dd.MM.yyyy");
                //MessageBox.Show($"Letzter Tag im Monat {date.ToString("MMMM yyyy")}: {lastDayOfMonth.ToString("dd.MM.yyyy")}");
                ReplaceTextInWordDocument3(filePath, searchString, replaceString, searchDate, temporarydate, Seiten);

            }

Macht natürlich mehr Sinn, alles über C# zu steuern, aber ich bin da eher ein Laie in C# Programmieren.

Aber zumindest läuft es schon mal fürs Erste.

Ich überlege jetzt noch, dass ich vielleicht nur 1 Word Dokument öffne, es bearbeite drucke und dann wieder bearbeite. Aktuell wird ja für jede Version ein neues Word Dokument geöffnet, bearbeitet und dann gedruckt und wieder geschlossen, was wohl ineffizent ist. Aber der Druckauftrag ist sowieso zu langsam von Windows wie ich finde.

Danke, ich werde mir den Process explorer anschauen, ob ich da was rausfinden kann. kenne mich da 0 aus.

Ich bin auf die Idee gekommen ein Macro im Word zu schreiben, der mir die Warnung ignoriert und siehe da, die Warnung wird ignoriert und es wird gedruckt. ABER halt nur wenn ich das Makro ausführe im Word.

Kann man in C# ein Makro nach dem Öffnen aktivieren?

Sub AutoExec()
 ' Store current Background Printing setting.
Dim x As Boolean
x = Options.PrintBackground
' Turn off error messaging and Background Printing.
Application.DisplayAlerts = wdAlertsNone
Options.PrintBackground = False
' Print the active document.
ActiveDocument.PrintOut
' Turn on error messaging and restore Background Printing
' to original setting.
'Application.DisplayAlerts = wdAlertsAll
'Options.PrintBackground = x
End Sub

Ich habe die Seitenränder im Word von 0,42 (oben und unten) auf 0,1 cm reduziert und er druckt es ohne was abzuschneiden.

Wie kann ich schauen, welcher Process den Dialog aufmacht? Es wäre wohl auch eine Option, wenn ich zumindest das Fenster mit den Seitenränder sehe, wo ich zumindest JA drucken kann. Somit müsste ich halt nur mehr für jeden Ausdruck "Ja" klicken. Der Rest macht mein Code. Spart mir auch einiges an Arbeit.

.

Das Problem ist, dass es sich um Etiketten handelt die auf A4 sind. Da kann ich fast nicht aus, dass ich Richtung "Randlos" drucken möchte.

Das Dokument reizt halt die Ränder komplett aus (was leider nötig ist, weil sehr viel Text in den Etiketten sind). Aber beim Ausdruck wird nichts abgeschnitten oder so.

Wenn ich ein PDF drucke, dann klappt es ohne den Hinweis.

Ich glaube es braucht eine manuelle Eingabe. Wenn ich das Word Dokument direkt öffne und drucken möchte, kommt immer die Warnung "Ihre Seitenränder sind ziemlich schmal. Möglicherweise werden Teile des Inhalts beim Drucken abgeschnitten. Möchten Sie trotzdem drucken?"

Das sehe ich nicht, wenn ich es via C# ausdrucken möchte. Ich glaube er bleibt hier stehen. Wenn ich einen PDF Drucker als Standardwähle, dann funktioniert es Problemlos.

Der Punkt ist eher: Ich möchte zB 10 Seiten mit LOT 1, 10 Seiten mit LOT 2, 10 Seiten mit LOT 3....10 Seiten mit LOT 10.

Das funktioniert ja schon im prinzip mit meinem Code. Aber bei meinem Echten Drucker, hab ich halt diese Warnung "Ihre Seitenränder sind ziemlich schmal. Möglicherweise werden Teile des Inhalts beim Drucken abgeschnitten. Möchten Sie trotzdem drucken?"

Somit druckt es nicht. Wenn ich den PDF Drucker wähle, kommt die Warnung halt nicht von Word und er erstellt die PDFs

etwa so?

 wordApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;

                TimeSpan time = new TimeSpan(800);

                doc.PrintOut(20, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Seiten);

Also aktuell sehe ich, wie mein Code Word öffnet, die Stellen ersetzt und in der Leiste von Word steht halt "Es wird gedruckt". Und es erscheint auch in den Aufträgen vom Drucker, aber sie bleiben "In Warteschlange" und es wird nicht gedruckt.

im Word sehe ich noch eine Meldung:

"Bitte warten sie einen moment, Word muss zuerst das Drucken abschließen." als Infofenster. Wenn ich ein PDF erstelle funktioniert es, da ich ja eine Interaktion habe, wo ich das PDF speichere

Hallo,

ich habe ein Word Dokument, wo ich diverse Felder in C# über eine GUI befülle. Das funktioniert alles schön und gut.

Jetzt möchte ich dass ich das bearbeitete Word Dokument drucke, was als PDF klappt, aber bei meinem Drucker zickt er herum und es kommt eine "Warnung"

Diese möchte ich aber automatisch bestätigen, damit der Druck startet, weil sonst kommt das Dokument nur in die Warteschleife vom Drucker und es wird nicht gedruckt.

public void ReplaceTextInWordDocument2(string filePath, string searchText, string replaceText, string searchDate, string replaceDate, int Seiten)
       {
           Word.Application wordApp = null;
           Word.Document doc = null;
           try
           {
               // 1. Word Anwendung starten
               wordApp = new Word.Application();
               wordApp.Visible = true;
               // 2. Dokument öffnen
               object file = filePath;
               object nul = Type.Missing;
               doc = wordApp.Documents.Open(ref file, ref nul, ref nul,
               ref nul, ref nul, ref nul, ref nul, ref nul,
               ref nul, ref nul, ref nul, ref nul, ref nul,
               ref nul, ref nul, ref nul);
               Statuslabel.Text = "Dokument wird geöffnet...";
               // 3. Gesamten Inhalt auswählen
               doc.Content.Select();
               Statuslabel.Text = "Dokument wird gelesen...";
               // 4. Suchen und Ersetzen für LOT Wert
               Word.Find findObject = wordApp.Selection.Find;
               findObject.ClearFormatting();
               findObject.Text = searchText;
               findObject.Replacement.ClearFormatting();
               findObject.Replacement.Text = replaceText;
               Statuslabel.Text = "LOT wird gesucht...";
               // Replace-Parameter richtig setzen für LOT Wert
               findObject.Execute(
               FindText: searchText,
               ReplaceWith: "LOT " + replaceText,
               Replace: Word.WdReplace.wdReplaceAll);
               Statuslabel.Text = "LOT wird gesucht und Ersetzt...";
               //ReplaceDatum
               Word.Find findDate = wordApp.Selection.Find;
               findDate.ClearFormatting();
               findDate.Text = searchDate;
               findDate.Replacement.ClearFormatting();
               findDate.Replacement.Text = replaceDate;
               Statuslabel.Text = "Datum wird gesucht...";
               // Replace-Parameter richtig setzen
               findDate.Execute(
               FindText: searchDate,
               ReplaceWith: replaceDate,
               Replace: Word.WdReplace.wdReplaceAll);
               Statuslabel.Text = "Datum wird gesucht und Ersetzt...";
               // 5. Dokument speichern und schließen
               doc.PrintOut(20, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Seiten); //Seiten ist die Anzahl wie viele gedruckt wird
               Statuslabel.Text = "Es wird gedruckt...";
               object saveChanges = Word.WdSaveOptions.wdSaveChanges;
               doc.SaveAs2("Print.docx", ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul, ref nul);
               doc.Close(SaveChanges: Word.WdSaveOptions.wdDoNotSaveChanges);
               wordApp.Quit(saveChanges, ref nul, ref nul);
               //doc.Close(ref saveChanges, ref nul, ref nul);
               //wordApp.Quit(ref saveChanges, ref nul, ref nul);
               //MessageBox.Show("Erledigt");
               Statuslabel.Text = "Fertig";
           } 

Wie kann ich diese Meldung unterdrücken bestätigen, damit der Druck startet?

Bin da eher ein Laie in C#

Hallo!

Ich habe hier eine vbe Datei, die ich als Eingebettete Ressource in das Projekt eingefügt. Wie kann ich diese Datei jetzt von der Exe dann extrahieren und in einem Ordner kopieren?

Mit dem Streamreader/writer würde es ja nicht funktionieren, da die vbe ja verschlüsselt ist oder irre ich mich?

Liegt wirklich wohl an meinem Domainaccount.
Hab es jetzt in einer anderen Domäne probiert und das Funktioniert wunderbar. Kann jetzt ohne Probleme per Remote Benutzer zur gruppen hinzufügen oder löschen.

Funktioniert prächtig!

Vielen Dank

Also nach Abt's Code geht es nur, wenn ich die Gruppe auf meinen Server abrufen, auf einen anderen Client(gleicher Account mit Lokale Adminrechte) hab ich auch eine Zugriffsverweigerung.

Hallo!

Ich interessiere mich auch für so eine Lösung. Derzeit hab ich es über "net localgroup" gelöst und die Gruppen ausgelesen.

Also ich lese die SID aus für die Administratorgruppe und speiche sie in einem string.

var sidLocalAdmin = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);     
            var admingroup = sidLocalAdmin.Translate(typeof(NTAccount)).ToString();
            string admin = Regex.Match(admingroup, @".+\\(.+)", RegexOptions.Compiled).Groups[1].Value;

Aber derzeit liest er es ja nur auf den lokalen Rechner aus. Wie kann ich den auf einen anderen PC die Gruppe auslesen?

Hallo!

Hab die Lösung von Herbivore mit dem Replace genutzt.

for (int i = 0; i <= 10; i++)
                    {
                        monitorname += Char.ConvertFromUtf32(dynName[i]);
                        seriennummer += Char.ConvertFromUtf32(dynSerial[i]);
                    }
                    monitorinfo = monitorname + "\t" + seriennummer + Environment.NewLine;
                    monitorinfo = monitorinfo.Replace("\0", " ");

Ausgabe ist jetzt halt so:
HP Samsung \t HPseriennummer SAMSUNGSierennummer

Nicht wunderschön aber es reicht für mich aus.

Ah..das erklärt einiges..Bekomme jetzt endlich "brauchbare" ergebnisse.

Aber leider ist die Ausgabe noch nicht sauber. Mein Code

public static string GetMonitorID()
        {
        //    string monitorname = "";
        //    string seriennummer = "";
            string ausgabe="";
            dynamic dynName;
            dynamic dynSerial;
            try
            {
                ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\wmi", "SELECT * FROM WmiMonitorID");
                foreach (ManagementObject queryObj in searcher.Get())
                {
                    dynName = queryObj["UserFriendlyName"];
                    dynSerial = queryObj["SerialNumberID"];

                    //ausgabe += nameX[0] + " " + serx + Environment.NewLine;
                    for(int i=0; i<=10;i++)
                    {
                        monitorname += Char.ConvertFromUtf32(dynName[i]);
                        monitorserial += Char.ConvertFromUtf32(dynSerial[i]);
                    }
                    ausgabe += monitorname + monitorserial;
                }
                return ausgabe;
            }
            catch (Exception)
            {
                return ausgabe = "Keine Monitore gefunden";
            }
        }

folgendes bekomme ich bei den Variablen raus:
ausgabe ="HP\0\0\0\0SERIENNUMMERHP\0HP\0\0\0\0SAMSUNG\0\0\0\0SERIENNUMMERSAMSUNG\00\0\0\0\0\0\0\0\0\0\0"
monitorname="HP\0\0\0\0SAMSUNG\0\0\0\0"
monitorserial="SERIENNUMMERHP\0\0\0\0\SERIENNUMMERSAMSUNG\0\0\0\0\0\0\0"

Der Samsung hat keine Seriennummer. Soweit so gut.
Nur bekomme ich beim string ausgabe nur den text "HP" raus. alles was nach dem \0 wird einfach abgeschnitten. Sprich keine Seriennummer oder sonstiges wird angezeigt.

Ich möchte den Text in folgendem Format:
HP SERIENNUMMERHP
SAMSUNG SERIENNUMMERSAMSUNG

Hallo!

Ich lese über WMI ein Objekt raus. Nur ist der Typ uint16. Somit kann ich nichts anfangen. Ich möchte die Informationen rausbkommen. Nur wie bekomme ich diese Information als String?

Mit Powershell funktioniert die Ausgabe korrekt, nur in C# bekomme ich folgende ausgabe: System.UInt16[]

Hab auch es auch im Debug Verzeichnis probiert und die exe mit Adminrechte gestartet, dass hat leider auch nicht funktioniert. Er nimmt die Dateien nicht an.

Hab mal ein neues Projekt mit 2 textboxen gemacht und da funktioniert drag und drop. Sprich textbox1 auf textbox2 kopieren.

Folgendes ist mir jetzt aufgefallen:

Wenn ich VS als normalen Benutzer starten, kann ich die Daten kopieren, aber sobal dich als Administrator anmelden, kann ich keine Dateien mehr per Drag und Drop kopieren!

Folgende Fehlermeldung taucht dann auf:> Fehlermeldung:

UnauthorizedAccessException wurde nicht von Benutzercode behandelt. - Der Zugriff auf den Pfad "C:\Users\Public\Desktop\Datei.txt" wurde verweigert.

Wenn ich das Programm jetzt als Admin starte, kann ich kein Drag and Drop machen, wenn das Programm normal gestartet wird, kann ich Drag and Drop ausführen, aber ich habe keine Berechtigungen auf den Desktop zu kopieren.

Folgende "Lösung" hätte ich gefunden:
Man muss VS als Administrator starten und danach den Explorer killen und dann den Explorer als Administrator starten. Dann geht auch Drag and Drop. Leider ist das keine schöne Lösung, aber es funktioniert zumindest. Hat jemand eine bessere Idee wie ich das realisieren könnte.

Adminrechte hab ich schon. Kann ja den PC umbennen, Software installieren etc.

Hab derzeit leider ein anderes problem:

Hab hier eine Listbox und habe dann die Methoden für DragDrop und DragEnter geschrieben. Diese hab ich natürlich in den Properties aktiviert.

Die Fuktion AllowDrop wurde ebenfalls aktiviert, nur lässt er mir keine Dateien mehr in die Listbox ablegen. Wenn ich mit der Maus in die Listbox reinfahre, bleibt da nur ein durchgestrichener Kreis.

Im Form1.Designer.cs ist es aufgelistet:

            this.dropBox.DragDrop += new System.Windows.Forms.DragEventHandler(this.Box_DragDrop);
            this.dropBox.DragEnter += new System.Windows.Forms.DragEventHandler(this.Box_DragEnter);

Ja die PC's sind in einer Domäne, aber ich habe beschränkte Admin Rechte. Per Copy und Paste kann ich in den Public\Desktop Ordner schreiben, nur will ich es halt etwas automatisieren.

Hab leider die Exception jetzt nicht zur Hand, aber ich kann mich erinnern, dass Visual Studio sagte, dass der Zugriff verweigert wurde, obwohl ich Visual Studio als Admin gestartet habe. Hab auch im Manifest RequireAdminrights angegeben. Somit hab ich Adminrechte

Hallo!

Ich suche eine Methode, wie ich Dateien auf den öffentlichen Desktop, also C:\Users\Public\Desktop ablegen kann.

Meine Methode

        public void DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            string path = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            string filesource = null;
            string[] FileList = (string[])e.Data.GetData(DataFormats.FileDrop, false);
            string filename = "";

            foreach (string file in FileList)
            {
                filesource = file;
                txtbox.Text= filesource;
                filename = Path.GetFileName(filesource);
            }
            System.IO.File.Copy(filesource, path + "\\" + filename,true);
        }

leider wird der Zugriff verwehrt. Welche Möglichkeiten gibt es da noch?

Hallo!

Ich hab folgendes Problem. In meiner Arbeit muss ich Hostname aus der Domäne löschen lassen, damit der neue Rechner den gleichen Hostname erhalten kann wie der alte Rechner. Mit meinem Code funktioniert, dass Umbenennen schon, aber leider fliegt der Rechner jedesmal aus der Organisation Unit. Wenn ich es händisch lösche unter die Windows Funktion, funktioniert es problemlos. Die Frage ist jetzt eher, welche der Funktionen richtig ist für mein Vorhaben? Ein Domainjoin ist nicht nötig, da der Rechner bereits in der Domäne ist.

Vielleicht gibt es ja eine andere Funktion dafür...


        #region Computername
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        static extern bool SetComputerNameEx(COMPUTER_NAME_FORMAT NameType, string lpBuffer);

        enum COMPUTER_NAME_FORMAT
        {
            ComputerNameNetBIOS,
            ComputerNameDnsHostname,
            ComputerNameDnsDomain,
            ComputerNameDnsFullyQualified,
            ComputerNamePhysicalNetBIOS,
            ComputerNamePhysicalDnsHostname,
            ComputerNamePhysicalDnsDomain,
            ComputerNamePhysicalDnsFullyQualified,
        }
        #endregion

        public static bool SetMachineName(string newName)
        {
            try
            {
                DialogResult dr = MessageBox.Show("Neuer Hostname nach Neustart: " + newName);
                return SetComputerNameEx(COMPUTER_NAME_FORMAT.ComputerNamePhysicalDnsHostname, newName");
            }
            catch (Exception)
            {
                return false;
            }
        }

Das ist ja mal verständlich und leicht umzusetzen!! 👍

Sehr schön, gefällt mir sehr gut.
Werd mich damit noch genauer beschäftigen.. aber erstmal Danke für eure Hilfe!!

Hallo!

Ich suche eine alternative bzw. bessere Lösung (am besten auch leicht verständlich) um einen String eingabe zu überprüfen.

Die Überprüfung soll folgendes machen:
Der 1. Buchstabe muss ein Großbuchstabe sein und ab dem 2. ein Kleinbuchstabe sein und es sollten mindestens 2 Zeichen lang sein.

Funktionieren tut sie ja, nur vielleicht kann mir jemand einen elegantere Lösung vorschlagen.


private bool CheckString(string str)
        {
            bool isValid = false;

            if (str[0] >= 'A' && str[0] <= 'Z' && str.Length > 1)
            {
                for (int i = 1; i < str.Length; i++)
                {
                    if (str[i] >= 'a' && str[i] <= 'z')
                    {
                        isValid = true;
                    }
                }
            }
            return isValid;
        }