Benutzer mit den meisten Antworten
Insufficient security permissions to set the system date.

Frage
Antworten
-
Hallo,
unter welchem Betriebssystem entwickelst du denn? Unter Vista oder Windows 7 sollte man sich so eine app.manifest generieren lassen:
Projekteinstellungen im Tab "Anwendung" auf den Button "Einstellungen für die Benutzerkonstensteuerung anzeigen" klicken. Dazu wird die Datei "app.manifest" im Projektordner generiert.
Der inhalt:
<?xml version="1.0" encoding="utf-8"?> <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <!-- UAC-Manifestoptionen Wenn Sie die Ebene der Benutzerkontensteuerung für Windows ändern möchten, ersetzen Sie den Knoten "requestedExecutionLevel" wie folgt: <requestedExecutionLevel level="asInvoker" uiAccess="false" /> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> Wenn Sie aus Gründen der Abwärtskompatibilität Datei- und Registrierungsvirtualisierung verwenden möchten, löschen Sie den Knoten "requestedExecutionLevel". --> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> </asmv1:assembly>
Der Wert sollte dann angepasst werden.
Weitere Informationen zum erstellen der Anwendung:
http://www.nbdtech.com/Blog/archive/2008/06/16/The-Application-Manifest-Needed-for-XP-and-Vista-Style-File.aspxCreate and Embed an Application Manifest with Your Application
http://msdn.microsoft.com/en-us/library/bb756929.aspx
MfG, Sebastian Gross- Als Antwort markiert Markus222 Donnerstag, 22. Juli 2010 13:47
Alle Antworten
-
Hallo Markus,
ich bekomme obige Security Exception bei
Today = dtpDate_Current_Select.Value
(Windows 7, VS 2010 Professional)Was ist zu tun um die Ausführung zu ermöglichen?
Wenn Du die Systemzeit ändern möchtest, muss Deine Anwendung als Administrator ausgeführt werden (Rechtsklick auf die EXE und "Als Administrator ausführen). Einem Benutzer ist das Ändern der Systemzeit nicht gestattet. Wenn die Benutzerkontensteuerung aktiv ist, kannst Du zwar Mitglied in der Gruppe der Administratoren sein, hast aber dennoch zunächst einfach Benutzerrechte und musst erhöhte Rechte, wie beschrieben anfordern.
Warum möchtest Du die Systemzeit ändern?
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Thorsten,
ich habe Termine in meiner Anwendung die beim Anlegen automatisch ein Löschdatum bekommen. Dieses befindet sich eine einstellbare Zeit nach Terminende.
(Oder auch ausschaltbar.)
Auf diese Weise vermeide ich dass sich alte Termine in der Datenbank anhäufen und vermeide lästiges Löschen von erledigten Terminen von Hand.
Dies birgt aber die Gefahr, das wenn aus irgendwelchen Gründen das Systemdatum um z.B. ein Jahr in die Zukunft verstellt wurde Termine unzulässigerweise gelöscht werden. Daher erfolgt zu Programmstart ein Vergleich des aktuellen Datums mit dem Datum an dem das Programm zuletzt aktiv war. Überschreitet die Differenz eine bestimmte (einstellbare) Zeitspanne erfolgt eine Sicherheitsabfrage ob das Systemdatum korrekt ist.
Ist es nicht korrekt besteht innerhalb der Meldung das Systemdatum zu korrigieren mittels DateTimePicker:
Today = dtpDate_Current_Select.Value.
Muss ich die Anwendung in die Exception laufen lassen und dann eine entsprechende Meldung herausbringen: Bitte Programm beenden und Programm als Aministrator ausführen? Das erscheint mir alles andere als elegant. Gibt es nicht innerhalb des Programms die Möglichkeit zu sagen: Dieses Programm wird als Administrator ausgeführt. (Notfalls ein separater Prozess der nur Today setzt.)
Markus
-
Hallo Markus,
du kannst auch von vornerein einstellen, welche Rechte benötigt werden, um dein Programm ausführen zu können.
Ein Beispiel wie du das konfigurieren kannst habe ich vor einer Weile in meinem Blog beschrieben.
Administratorrechte für eigenes Programm einfordern
http://blog.bigbasti.com/net-administratorrechte-fur-eigenes-programm-einfordern/Enabling Your Application for UAC
http://www.professionalvisualstudio.com/blog/2007/10/05/enabling-your-application-for-uac-on-vista/
MfG, Sebastian Gross- Bearbeitet Sebastian Gross Donnerstag, 22. Juli 2010 13:33
-
Hallo Sebastian,
habe deinen Blogeintrag gelesen. Am besten erscheint mir eine eigene Assembly mit den Programmteilen die Administratorrechte erfordern zu erstellen und diese als eigenen Prozess zu starten. So dass der Anwender seine Bestätigung nur dann geben muss wenn es notwendig ist.
Doch wie sieht das app.manifest dieser Assembly genau aus?
Mein derzeitiges:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<applicationRequestMinimum>
<defaultAssemblyRequest permissionSetReference="Custom" />
<PermissionSet class="System.Security.PermissionSet" version="1" ID="Custom" SameSite="site" Unrestricted="true" />
</applicationRequestMinimum>
</security>
</trustInfo>
</asmv1:assembly>
Von requestedExecutionLevel steht dort nichts! Wie muss die die app.manifest für die Assembly mit Administratoraufgaben aussehen?Danke, Markus
-
Hallo Markus
ordentliche Rechner haben heutzutage fast immer eine korrekte Systemzeit, entweder (ab Windows XP eh voreingestellt!) ab Internet-Zeit (NTP), oder in einem Intranet (Firma) wird die Zeit fast immer (zentral verordnet!) ab dem Server synchronisiert!
Allgemein kommt es nur zu einem Chaos und Fehlfunktionen (zB aussperren beim Anmelden!), wenn Anwender selber an der Systemzeit herumpfuschen.
Und genauso ist es IMHO ein Unsinn, wenn eine 'normale' App an der Systemzeit dreht.
Die App einzig aus diesem Grunde mit Admin-Rechten auszuführen ist extrem fragwürdig.
IMHO solltest du nur eine verständliche Information anzeigen und dem Anwender die nötigen Massnahmen vorschlagen.
Beachte weiter, dass hier uU auch Zeitzonen extreme Fehlinterpretationen produzieren könnten.P.S. dass (ausgerechnet) VB.NET eine Methode zum ändern der Systemzeit hat, ist IMHO nur aus 'antiken' Gründen und ein 'Sündenfall'.
-
Hallo Thomas,
ja. Das mit Maßnahmen vorschlagen wäre ausreichend da es eh ein seltener Fall sein dürfte.
(Dennoch gefällt mir das sofortige Anbieten der Korrekturmöglichkeit besser weil es die einfachste Möglichkeit für den Anwender ist.)Ungeachtet dessen würde mich interessieren wie man eine Assembly gestaltet die Aufgaben die Administratorrechte erfordern ausführt.
(Beitrag über deinem.) Ausser der Systemzeit könenn ja noch weitere Dinge kommen...Markus
-
Hallo,
unter welchem Betriebssystem entwickelst du denn? Unter Vista oder Windows 7 sollte man sich so eine app.manifest generieren lassen:
Projekteinstellungen im Tab "Anwendung" auf den Button "Einstellungen für die Benutzerkonstensteuerung anzeigen" klicken. Dazu wird die Datei "app.manifest" im Projektordner generiert.
Der inhalt:
<?xml version="1.0" encoding="utf-8"?> <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <!-- UAC-Manifestoptionen Wenn Sie die Ebene der Benutzerkontensteuerung für Windows ändern möchten, ersetzen Sie den Knoten "requestedExecutionLevel" wie folgt: <requestedExecutionLevel level="asInvoker" uiAccess="false" /> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> Wenn Sie aus Gründen der Abwärtskompatibilität Datei- und Registrierungsvirtualisierung verwenden möchten, löschen Sie den Knoten "requestedExecutionLevel". --> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> </asmv1:assembly>
Der Wert sollte dann angepasst werden.
Weitere Informationen zum erstellen der Anwendung:
http://www.nbdtech.com/Blog/archive/2008/06/16/The-Application-Manifest-Needed-for-XP-and-Vista-Style-File.aspxCreate and Embed an Application Manifest with Your Application
http://msdn.microsoft.com/en-us/library/bb756929.aspx
MfG, Sebastian Gross- Als Antwort markiert Markus222 Donnerstag, 22. Juli 2010 13:47
-
Hallo Sebastian,
Windows 7 Home Premium und Visual Studio 2010 Professional.
Den Button "Einstellungen für die Benutzerkonstensteuerung anzeigen" gibt es so nicht bei mir. Benutze die englische Version.
Heisst hier View windows settings.Dann erscheint das folgende:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<applicationRequestMinimum>
<defaultAssemblyRequest permissionSetReference="Custom" />
<PermissionSet class="System.Security.PermissionSet" version="1" ID="Custom" SameSite="site" Unrestricted="true" />
</applicationRequestMinimum>
</security>
</trustInfo>
</asmv1:assembly>Werde mal deine app.manifest kopieren und schauen.
-
Ungeachtet dessen würde mich interessieren wie man eine Assembly gestaltet die Aufgaben die Administratorrechte erfordern ausführt.
1.) Assemblies laufen nicht alleine, da braucht es einen Laufzeit-Kontext (Prozess, evtl. AppDomain; Thread), mit entsprechender (Windows-Admin) Security.2.) die meist 'kritische' Frage wäre viel mehr, wo das benötigte Administrator-Passwort den plötzlich herkommt!
-
Ja. (Wenn man das Passwort nicht weiss muss man eben abbrechen.)
Jedenfalls läuft das Setzen von Today mit folgender app.manifest
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly> -
Hallo Markus,
Dies birgt aber die Gefahr, das wenn aus irgendwelchen Gründen das Systemdatum um z.B. ein Jahr in die Zukunft verstellt wurde Termine unzulässigerweise gelöscht werden. Daher erfolgt zu Programmstart ein Vergleich des aktuellen Datums mit dem Datum an dem das Programm zuletzt aktiv war. Überschreitet die Differenz eine bestimmte (einstellbare) Zeitspanne erfolgt eine Sicherheitsabfrage ob das Systemdatum korrekt ist.
Das sollte Deine Anwendung nicht kümmern. Wenn der Anwender an der Uhrzeit seines Rechners spielt, ist dies sein persönliches Pech, um es mal vereinfacht zu sagen. Wenn Du den Anwender unbedingt vor eigenen Dummheiten schützen möchtest, gib eine Meldung aus, dass die Systemzeit nicht passt und gib ihm die Optionen "Fortfahren" oder "Abbrechen", wobei letzteres Deine Anwendung beendet und dem AW die Gelegenheit gibt, die Systemzeit über die von Windows gebotenen Wege korrekt einzustellen.
Eine Terminverwaltung, die von mir bei jedem Start verlangen würde, sie als Admin auszuführen, würde vom Rechner fliegen, da ich dahinter schlechtes Design sehen würde, wie auch ein Sicherheitsrisiko und Komfortbeschränkung.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Thorsten,
ja. Aber meine Fusspflegerin möchte ihre Termine anstatt mit Terminkalender mit dem Programm verwalten. So sieht sie halt z.B. die Termine bei jedem Kunden, im Kalender und alle auf einmal. Benutzt XP. Stelle mir halt vor sie hat 2 Monate keine Sicherung gemacht und das Datum war ein Jahr vorgestellt...
Pech, ich weiss nicht. Wo man doch eine Sicherung einbauen könnte ;-)
Hinweis mit Option "Fortfahren" und "Abbrechen" mit Anwendung beenden ist aber absolut ok. Vermutlich die bessere Variante zu meiner.
Das Ausführen der Anwendung als Admin halte ich auch nicht für richtig.
Dennoch mache ich es so wie zuletzt beschrieben. (Allein schon aus Lernzwecken und um eine Assembly für Administratoraufgaben zu haben.)
Start der Anwendung mit Benutzerrechten. Anwendung vergleicht letztes Startdatum mit Systemdatum.Wenn Differenz > eingestellte tolerierbare Differenz dann Meldung mit der Option "Datum ist korrekt, fortfahren" oder der Option mit dem DateTimePicker das Datum zu korrigieren.
NUR wenn der Anwender diese letztere Option wählt wird die Adminstratoraufgaben Assembly als seperater Prozess gestartet. Diese fragt nach Adminrechten und ändert das Datum.
Mal sehen ob das alles so funktioniert. Und wie man Parameter übergibt. Soll ja für (zukünftige) verschiedene Administratoraufgaben parametriesierbar (uff Wie?? (schreibt man das)) sein.
Grüsse Markus
-
Hallo Markus,
ja. Aber meine Fusspflegerin möchte ihre Termine anstatt mit Terminkalender mit dem Programm verwalten. So sieht sie halt z.B. die Termine bei jedem Kunden, im Kalender und alle auf einmal. Benutzt XP. Stelle mir halt vor sie hat 2 Monate keine Sicherung gemacht und das Datum war ein Jahr vorgestellt...
ich könnte ja jetzt ketzerisch behaupten, dass solche Fehler eben vor allem durch solche Programme entstehen, die meinen Systemverwaltungsaufgaben übernehmen zu müssen und an der Systemzeit drehen, was Windows bereits weitaus besser regelt.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Ja. Man sollte es nicht tun.
Der Vollständigkeit halber bringe ich hier meinen Versuch einer Assembly die als separater Prozess gestartet wird und Administrator Aufgaben übernehmen soll. SystemDate_Set ist nur als Beispiel zu verstehen!
Welche Aufgaben dies sind und die entsprechenden Parameter werden als Kommandozeilenparameter an diese
Assembly übergeben.
Die Admin-Aufgaben sind deklariert in eienr Enumeration.
Public Enum enmAdminTask
Test = 1
SystemDate_Set
Insert_Other_Admin_Tasks_Here
End Enum
Falls es wirklich jemand liest wäre ich dankbar für Hinweise auf Fehler oder Vorschläge für sinnvolle Verbesserungen.
Und ob das so ein richtiger Weg ist oder vom Ansatz her so nicht gut.
Der folgende Code hat in der Assembly dieses app.manifest:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<applicationRequestMinimum>
<defaultAssemblyRequest permissionSetReference="Custom" />
<PermissionSet class="System.Security.PermissionSet" version="1" ID="Custom" SameSite="site" Unrestricted="true" />
</applicationRequestMinimum>
</security>
</trustInfo>
</asmv1:assembly>
If Now.Date <> dtpDate_Current_Select.Value Then
' Ausgelagerte Methode in separater Klasse.
ST.Service.AdminTasks.GL.clsAdminTasks_Service.SystemDate_Set_Cls _
(dtpDate_Current_Select.Value, _
cstrProc_DeclaringTypeName_And_ProcName)
End If
Aufgerufen wird eine Methode in
ST.Service.AdminTasks.GL.clsAdminTasks_Service.
Die Assembly dieser Klasse heisst ST.Service.GL.dll und hat das gleiche app.manifest wie oben.
Namespace ST.Service.AdminTasks.GL
Public Class clsAdminTasks_Service
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Enums.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Enum enmAdminTask
Test = 1
SystemDate_Set
Insert_Other_Admin_Tasks_Here
End Enum
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Konstanten.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Shared ReadOnly AdminTaskSystem_Return_ErrorMessage_FilePath_Cls As String = _
System.Windows.Forms.Application.StartupPath & _
"\AdminTaskSystem_Return_ErrorMessage.txt"
Private Shared ReadOnly mcstrAdminTasksSystem_Exe_FilePath_Cls As String = _
System.Windows.Forms.Application.StartupPath & _
"\SchertlerSoftware.InfoItems.Program.ST.Service.AdminTasksSystem.GL.exe"
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Public Shared Methoden.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Shared Function Test_Cls(Optional ByVal _
pstrProcCaller_DeclaringTypeName_And_ProcName As String = "") As Boolean
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim cstrProc_DeclaringTypeName_And_ProcName As String = _
"clsAdminTasks_Service.Test_Cls"
Dim blnProcRCOK As Boolean = False
Dim exProcEx As ST.Service.Exception.GL.clsService_Exception
Try
Debug.Assert(pstrProcCaller_DeclaringTypeName_And_ProcName = _
"clsMainAppUL.App_Run_DerivedFrom_ClsMainApp_NotPersist" _
OrElse pstrProcCaller_DeclaringTypeName_And_ProcName = "", _
"Called from wrong Procedure.")
' AdminTasksSystem_Exe_Run_Cls.
AdminTasksSystem_Exe_Run_Cls(enmAdminTask.Test)
blnProcRCOK = True
Catch ex As System.Exception
blnProcRCOK = False
ST.Service.Exception.GL.clsService_Exception. _
ObjInstance_Create_From_InnerException_Cls("", _
ex, Nothing, exProcEx)
End Try
If blnProcRCOK Then
Return True
Else
ST.Service.Prog.Proc.GL.clsProc_Service.ProcExit_WithEx_Service_Cls(exProcEx)
Return False
End If
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Shared Function SystemDate_Set_Cls(ByVal pdatSystemDate_New As Date, _
Optional ByVal _
pstrProcCaller_DeclaringTypeName_And_ProcName As String = "") As Boolean
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim cstrProc_DeclaringTypeName_And_ProcName As String = _
"clsAdminTasks_Service.SystemDate_Set_Cls"
Dim blnProcRCOK As Boolean = False
Dim exProcEx As ST.Service.Exception.GL.clsService_Exception
Try
Debug.Assert(pstrProcCaller_DeclaringTypeName_And_ProcName = _
"clsMainAppUL." & _
"Date_OK_Test_And_App_Run_Last_Date_Message_DerivedFrom_clsMainApp_NotPersist" _
OrElse pstrProcCaller_DeclaringTypeName_And_ProcName = "", _
"Called from wrong Procedure.")
If Now.Date <> pdatSystemDate_New Then
' AdminTasksSystem_Exe_Run_Cls.
' Kommandozeilenparameter werden durch Leerzeichen getrennt.
AdminTasksSystem_Exe_Run_Cls(enmAdminTask.SystemDate_Set, _
pdatSystemDate_New.Year.ToString & " " & _
pdatSystemDate_New.Month.ToString & " " & _
pdatSystemDate_New.Day.ToString)
End If
blnProcRCOK = True
Catch ex As System.Exception
blnProcRCOK = False
ST.Service.Exception.GL.clsService_Exception. _
ObjInstance_Create_From_InnerException_Cls("", _
ex, Nothing, exProcEx)
End Try
If blnProcRCOK Then
Return True
Else
ST.Service.Prog.Proc.GL.clsProc_Service.ProcExit_WithEx_Service_Cls(exProcEx)
Return False
End If
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Shared Function AdminTasksSystem_Exe_Run_Cls _
(ByVal pAdmin_Task As enmAdminTask, _
Optional ByVal pstrAdmin_Task_Parameter As String = "") As Boolean
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim cstrProc_DeclaringTypeName_And_ProcName As String = _
"clsAdminTasks_Service.AdminTasksSystem_Exe_Run_Cls"
Dim blnProcRCOK As Boolean = False
Dim exProcEx As ST.Service.Exception.GL.clsService_Exception
Dim process_AdminTasks As System.Diagnostics.Process
Dim strAdmin_Task_Parameter As String = ""
Try
' Es kann sein dass pstrpstrAdmin_Task_Parameter ein Leerstring ist.
' Kommandozeilenparameter werden durch Leerzeichen getrennt.
strAdmin_Task_Parameter = pAdmin_Task.ToString & " " & pstrAdmin_Task_Parameter
strAdmin_Task_Parameter = strAdmin_Task_Parameter.Trim
'
' Mit der nächsten Awnweisung erscheint die Abfrage der Benutzerkontensteuerung.
'
' Kommandozeilenparameter werden durch Leerzeichen getrennt.
process_AdminTasks = _
Diagnostics.Process.Start _
(mcstrAdminTasksSystem_Exe_FilePath_Cls,
strAdmin_Task_Parameter)
' Das Ende des gestarteten Prozesses abwarten, bis die Adminaufgaben erledigt sind.
Do While process_AdminTasks.HasExited = False
System.Windows.Forms.Application.DoEvents()
' Discard cached information about the process.
' After Refresh is called, the first request for information about each
' property causes the process component to obtain a new value from the associated process.
process_AdminTasks.Refresh()
' Wait 0.2 seconds.
System.Threading.Thread.Sleep(200)
Loop
If System.IO.File.Exists(AdminTaskSystem_Return_ErrorMessage_FilePath_Cls) Then
' D.h. es gab Fehler.
Dim strAdminTask_System_Return_ErrorMessage As String = ""
ST.Service.IO.GL.clsFile_Service.File_Read_From_FilePath_To_String _
(AdminTaskSystem_Return_ErrorMessage_FilePath_Cls, _
strAdminTask_System_Return_ErrorMessage)
System.IO.File.Delete(AdminTaskSystem_Return_ErrorMessage_FilePath_Cls)
Dim strAdminTask_ErrorMessage As String = _
"Error in " & cstrProc_DeclaringTypeName_And_ProcName & ":" _
& vbCrLf & vbCrLf & _
strAdminTask_System_Return_ErrorMessage
' Der Fehler wird an den Aufrufer als Exception weitergegeben.
Throw New System.ApplicationException(strAdminTask_ErrorMessage)
End If
blnProcRCOK = True
Catch ex As System.Exception
blnProcRCOK = False
ST.Service.Exception.GL.clsService_Exception. _
ObjInstance_Create_From_InnerException_Cls("", _
ex, Nothing, exProcEx)
End Try
If blnProcRCOK Then
Return True
Else
ST.Service.Prog.Proc.GL.clsProc_Service.ProcExit_WithEx_Service_Cls(exProcEx)
Return False
End If
End Function
End Class
End Namespace
Hier wird mittels Diagnostics.Process.Start
eine Methode der Assembly Program.ST.Service.AdminTasksSystem.GL.exe aufgerufen
die die Admin Aufgaben ausführen soll.
Die Assembly Program.ST.Service.AdminTasksSystem.GL.exe hat eine Referenz auf die Assembly ST.Service.GL.dll
in welcher sich die startende Methode befindet.
Diese Referenz dient zum Zugriff auf gemeinsam verwendete Deklarationen.
ST.Service.GL.dll hat keine Referenz auf Program.ST.Service.AdminTasksSystem.GL.exe.
Program.ST.Service.AdminTasksSystem.GL.exe hat folgendes app.manifest:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>
Die die AdminTasks ausführende Klasse clsAdminTasksSystem_Service in der Assembly Program.ST.Service.AdminTasksSystem.GL.exe:
Namespace ST.Service.AdminTasksSystem.GL
Public Class clsAdminTasksSystem_Service
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Shared Sub Main()
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Try
' Kommandozeilenparameter.
Dim strCmdArgs As String() = System.Environment.GetCommandLineArgs
' Fehler Datei löschen falls diese aus einem früherem Aufruf noch existiert.
If System.IO.File.Exists _
(ST.Service.AdminTasks.GL.clsAdminTasks_Service.AdminTaskSystem_Return_ErrorMessage_FilePath_Cls) Then
System.IO.File.Delete _
(ST.Service.AdminTasks.GL.clsAdminTasks_Service.AdminTaskSystem_Return_ErrorMessage_FilePath_Cls)
End If
' 1. Parameter ist Programmname.
If strCmdArgs.Length < 2 Then
Throw New ArgumentException("Command line argument list must not be empty.")
End If
Select Case strCmdArgs(1)
Case ST.Service.AdminTasks.GL.clsAdminTasks_Service. _
enmAdminTask.Test.ToString
AdminTask_Test_Cls(strCmdArgs)
Case ST.Service.AdminTasks.GL.clsAdminTasks_Service. _
enmAdminTask.SystemDate_Set.ToString
AdminTask_SystemDate_Set_Cls(strCmdArgs)
Case Else
Throw New ArgumentException("Admin task not implemented: " & strCmdArgs(1))
End Select
Catch ex As System.Exception
Dim objStackTrace As New StackTrace
Dim strErrorMessage As String = ""
strErrorMessage = "Error in " & _
objStackTrace.GetFrame(0).GetMethod.DeclaringType.Name & "." & _
objStackTrace.GetFrame(0).GetMethod.Name() & ":" _
& vbCrLf & vbCrLf & _
ex.Message _
& vbCrLf & vbCrLf & _
"Command line parameter:" & vbCrLf & _
System.Environment.CommandLine
' Die Fehlerdatei mit der Meldung erstellen.
ST.Service.IO.GL.clsFile_Service.File_Write_From_String_To_FilePath _
(ST.Service.AdminTasks.GL.clsAdminTasks_Service.AdminTaskSystem_Return_ErrorMessage_FilePath_Cls, _
strErrorMessage)
MsgBox(strErrorMessage)
End Try
' Hier endet der Prozess.
' MsgBox("The application is terminating")
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Shared Sub AdminTask_Test_Cls(ByVal pstrCmdArgs As String())
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
MsgBox(pstrCmdArgs(1))
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Shared Sub AdminTask_SystemDate_Set_Cls(ByVal pstrCmdArgs As String())
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Die eigentliche Administratoraufgabe. SystemDate nur als Beispiel.
Dim intSystemDate_Year_New As Integer
Dim intSystemDate_Month_New As Integer
Dim intSystemDate_Day_New As Integer
If UBound(pstrCmdArgs) <> 4 Then
Throw New ArgumentException("Command line argument for AdminTask_SystemDate_Set must contain 4 parameters.")
End If
Try
intSystemDate_Year_New = CType(pstrCmdArgs(2), Integer)
Catch ex As System.Exception
Throw New ArgumentException("Command line argument 2 for AdminTask_SystemDate_Set must be a valid year.")
End Try
Try
intSystemDate_Month_New = CType(pstrCmdArgs(3), Integer)
Catch ex As System.Exception
Throw New ArgumentException("Command line argument 3 for AdminTask_SystemDate_Set must be a valid month.")
End Try
Try
intSystemDate_Day_New = CType(pstrCmdArgs(4), Integer)
Catch ex As System.Exception
Throw New ArgumentException("Command line argument 4 for AdminTask_SystemDate_Set must be a valid day.")
End Try
Today = DateSerial(intSystemDate_Year_New, intSystemDate_Month_New, intSystemDate_Day_New)
End Sub
End Class
End Namespace
- Bearbeitet Markus222 Freitag, 23. Juli 2010 16:45 Korrektur