none
Insufficient security permissions to set the system date. RRS feed

  • Frage

  • Hallo,

    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?

    Danke, Markus

     

    Donnerstag, 22. Juli 2010 11:37

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.aspx

    Create 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
    Donnerstag, 22. Juli 2010 13:16

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
    Donnerstag, 22. Juli 2010 11:51
    Moderator
  • 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

     

     

     

     

    Donnerstag, 22. Juli 2010 12:02
  • 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
    Donnerstag, 22. Juli 2010 12:19
  • 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


     

    Donnerstag, 22. Juli 2010 12:57
  • 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'.

    Donnerstag, 22. Juli 2010 13:05
  • 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

     

     

     

    Donnerstag, 22. Juli 2010 13:15
  • 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.aspx

    Create 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
    Donnerstag, 22. Juli 2010 13:16
  • 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.

     

     

    Donnerstag, 22. Juli 2010 13:23
  • 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!

    Donnerstag, 22. Juli 2010 13:29
  • 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>

     

    Donnerstag, 22. Juli 2010 13:47
  • 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
    Donnerstag, 22. Juli 2010 14:01
    Moderator
  • 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

     

     

     

     

    Donnerstag, 22. Juli 2010 14:40
  • 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
    Donnerstag, 22. Juli 2010 16:56
    Moderator
  • 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
    Freitag, 23. Juli 2010 14:04