CAS-Problem
-
Ich habe im Laufe der Übungen für 70-536 einen kleinen Taskmanager erstellt, der auch einen Performance-Counter beinhaltet. Da ich auch mit Netzlaufwerken arbeite ist mir aufgefallen, dass wenn ich das Progrmam von der Netzwerkfestplatte aus starte die Berechtigungen für den Performance-Counter fehlen.
In den 70-536-Unterlagen habe ich bei den Sicherheitsthemen nur gefunden, wie die Berechtigungen für aufgerufene Assemblys verändert werden können, diverse Experimente brachten aber keinen Erfolg; ist es möglich dass das Programm sich selbst die Berechtigung gibt (wenn auch mit einer Warnung vom Framework)?Ansonsten wäre auch eine Möglichkeit zu überprüfen ob die Berechtigung vorliegt und im anderen Fall den Timer nicht zu starten.
Ein weiteres Problem; ich habe für die Prozessorzeit einen Progress-Bar, der aber verhält sich sehr willkürlich, als sei er zu langsam (geht manchmal hoch wenn der Prozessor eine halbe Sekunde vorher ausgelastet war, dann bleibt er weg usw). Der Timer ist ja nur auf 500 ms eingestellt!
Der Quellcode (ist nicht so lang)
namespace netTaskmanager {//[PerformanceCounterPermission(System.Security.Permissions.SecurityAction.Assert, CategoryName="Prozessor")] //[PerformanceCounterPermission(System.Security.Permissions.SecurityAction.RequestMinimum, CategoryName="Prozessor")] public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { timer1.Enabled = true; ListProcesses(); } private void ListProcesses() { listBox1.Items.Clear(); Process[] processes = Process.GetProcesses(); foreach (Process p in processes) { StringBuilder s = new StringBuilder(); s.Append(p.ProcessName); if (!p.Responding) { s.Append(" Reagiert nicht"); } listBox1.Items.Add(s.ToString()); } } private void button1_Click(object sender, EventArgs e) { if (listBox1.SelectedItem != null) { Process[] processes = Process.GetProcessesByName(listBox1.SelectedItem.ToString()); foreach (Process p in processes) { p.Kill(); } ListProcesses(); } } private void timer1_Tick(object sender, EventArgs e) { label1.Text = performanceCounter1.NextValue().ToString(); progressBar1.Value = (int)performanceCounter1.NextValue(); progressBar1.Invalidate(); } private void button2_Click(object sender, EventArgs e) { Process p = Process.Start("explorer"); ListProcesses(); } private void button3_Click(object sender, EventArgs e) { Process[] processes = Process.GetProcessesByName("explorer"); foreach (Process p in processes) { p.Kill(); } ListProcesses(); } private void Aktualisieren_Click(object sender, EventArgs e) { ListProcesses(); } private void button4_Click(object sender, EventArgs e) { Process[] processes = Process.GetProcesses(); foreach (Process p in processes) { if (!p.Responding) { p.Kill(); } } ListProcesses(); } } }