Autor Beitrag
Geneesys
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Di 16.08.16 16:44 
Hallo zusammen,

nach dem ich nun 2 Stunden am werkeln und testen bin brauche ich wohl doch eure hilfe.

Ich habe eine ListBox1 die mit mehreren Namen gefüllt ist (Test.exe, Test2.exe, Test3.exe)

Ebenfalls habe ich eine 2te Listbox die mit den aktuellen Processen meines Systems gefüllt ist. Wie z.B Notepad

Nun möchte ich beide Listen vergleichen und wenn eine Task/exe übereinstimmt aus beiden listen soll er die exe/Process beenden.

Wie mache ich das am besten ?

Mein Code zum befüllen der beiden ListBoxen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
        foreach (Process p in Process.GetProcesses())
            {
                listBox2.Items.Add(p.ProcessName);
            }

            DirectoryInfo d = new DirectoryInfo(@"C:\temp")
            FileInfo[] Files = d.GetFiles("*.exe", SearchOption.AllDirectories); 
            string str = "";
        
                foreach (FileInfo file in Files)
            {
                str = file.Name;

             listBox1.Items.Add(str);

            }


Wie vergleiche ich nun die beiden und gebe dann dem Process.Kill die info mit ?

Vielen Dank
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 16.08.16 17:07 
So wie dein Code jetzt ist, müßtest du es händisch machen, also die 2. ListBox für jedes Element der 1. ListBox durchsuchen.
Besser wäre jedoch du würdest die beiden Listen in eigenen (Member-)Variablen (bzw. Properties) halten und diese dann einfach an die ListBox binden:
ausblenden C#-Quelltext
1:
2:
3:
4:
Processes = Process.GetProcesses();

listBox.DataSource = processes;
listBox.DisplayMemberName = "ProcessName";
(gleiches dann für deine 2. Liste Files)
Nun kannst du z.B. eine der Linq-Methoden zum Vergleichen benutzen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
foreach(var file in Files)
{
  string fileName = file.Name; // wegen Capturing in Lambda-Ausdruck als eigene Variable
  var process = Processes.FirstOrDefault(p => p.Name == fileName);
  if (process != null)
  {
    process.Kill();

    // oder besser
    process.CloseMainWindow();
  }
}

Für diesen Beitrag haben gedankt: Geneesys
Geneesys Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Fr 26.08.16 09:59 
Danke dir!

Ich hatte vor ein Programm zu schreiben was die installieren Apps in Windows 10 ausliest und dann gegencheckt ob die App läuft.
Da man die Apps in Windows 10 im Unternehmen jetzt nur noch mit der Enterprise Version sperren kann.(GPOS] Den Store kann ich auch nicht sperren da er für interne Unternehmens Apps benötigt wird. (Diese werden leider auch darüber gezogen)

Nunja ich konnte es jetzt nicht per C# lösen aber Batch - hoffe es ist okey wenn ich die Lösung hier poste.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
@echo off
set Version=V.5
set str=sample.exe
set BatchPath="%~dp0\Policymsg.vbs"
set LogAppPath=%~dp0\InstApps.log
set WindowsAppPath="C:\Program Files\WindowsApps\"
set WhiteList="%~dp0\WhiteList.cfg"
if not exist %WhiteList% echo WhiteList %Version% by Geneesys>>%WhiteList%
:go
erase %LogAppPath%
CLS
for /f "delims=" %%a in ('dir /b /s /a-d %WindowsAppPath%*.exe ^| findstr /iveg:%WhiteList%') do echo %%~nxa>>%LogAppPath%
color a
FOR /F %%i in (%LogAppPath%) do (timeout /t 1
taskkill /F /IM %%i >nul 2>&1 
if errorlevel 1 (echo Scanning for denied application: %%i) else (set str=%%i & goto :deniedmsg))
goto go
:deniedmsg
color c
echo msgbox"This application (%str%) is not allowed at our company. Contact your Administrator-Team for more information.",vbExclamation , "Windows 10 Application policy"> %BatchPath%
%BatchPath%
erase %BatchPath%
goto go

Dies kann man dann als .exe kompilieren und als Dienst auf jedem PC, unsichtbar im Hintergrund laufen lassen. Den Pfad der WhiteList kann man anpassen so das alle Cleints eine List haben. In der Liste steht z.B der Store so das dieser nicht geblockt wird :)

Trotzdem noch mal danke fürs helfen und vllt braucht das hier ja mal jemand :)Bin kein Profi-Scripter aber es läuft auf über 250 Rechner problemlos.

Moderiert von user profile iconTh69: C#- durch Code-Tags ersetzt