Come gestire eventi utilizzando Visual Basic .NET o Visual Basic 2005

Traduzione articoli Traduzione articoli
Identificativo articolo: 814564 - Visualizza i prodotti a cui si riferisce l?articolo.
Per la una versione di Microsoft Visual C# .NET di questo articolo, vedere 815314.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In questo articolo viene descritto come accedere e personalizzare i registri eventi di Windows utilizzando Microsoft .NET Framework. ╚ possibile interagire con i registri eventi di Windows utilizzando la classe EventLog . ╚ possibile utilizzare la classe EventLog effettuare le seguenti operazioni:
  • Leggere i registri esistenti.
  • Scrivere voci nel registro eventi.
  • Creare o eliminare origini eventi.
  • Eliminare i registri.
  • Rispondere alle voci di log.
In questo articolo viene inoltre descritto come creare nuovi log durante la creazione un'origine eventi.


Requisiti


Nell'elenco seguente sono indicati hardware, software, infrastruttura di rete e i service pack necessari:
  • Microsoft .NET framework
  • Microsoft Visual Basic .NET o Microsoft Visual Basic 2005

In questo articolo si presume la conoscenza dei seguenti argomenti:
  • Microsoft Visual Basic .NET o sintassi di Microsoft Visual Basic 2005
  • Microsoft Visual Studio .NET o in ambiente Microsoft Visual Studio 2005
  • Gestione degli errori in .NET Framework

Trovare i registri esistenti su un computer


╚ possibile trovare i registri esistenti in un computer utilizzando il metodo GetEventLogs condiviso della classe EventLog . Il metodo GetEventLogs ricerca tutti i log eventi del computer locale e quindi crea una matrice di oggetti EventLog contenenti l'elenco. Nell'esempio di codice riportato di seguito recupera un elenco dei registri del computer locale e quindi vengono visualizzati i nomi dei log in una finestra di console:
      Dim remoteEventLogs() As EventLog

      'Gets logs on the local machine, give remote machine name to get the logs on the remote machine
      remoteEventLogs = EventLog.GetEventLogs(System.Environment.MachineName)

      Console.WriteLine("Number of logs on computer: " & remoteEventLogs.Length)

      'Display the list of event logs
      Dim log As EventLog
      For Each log In remoteEventLogs
         Console.WriteLine("Log: " & log.Log)
      Next log

Lettura e scrittura dei registri da locale e il sistema remoto e


Leggere i registri


Per leggere un registro eventi, utilizzare la proprietÓ di voci della classe EventLog . La proprietÓ Entries della classe EventLog Ŕ un insieme di tutte le voci nel registro eventi. Nell'esempio di codice riportato di seguito viene illustrato come scorrere questo insieme e come leggere tutti i movimenti del log specificato:
      ' Log type can be Application, Security, System or any other custom log
      ' Select the log type you want to read
      Dim logtype As String = "Application"

      ' In the constructor of the eventlog, pass the log type and the computer name 
      ' from which you want to read the logs 
      Dim evtLog As New EventLog(logtype, System.Environment.MachineName)

      Dim lastlogtoshow As Integer = evtLog.Entries.Count
      If lastlogtoshow <= 0 Then
         Console.WriteLine("There are no event logs in the log : " & logtype)
         Exit Sub
      End If

      ' Read the last record in the specified log 
      Dim currentEntry As EventLogEntry
      Dim i As Integer
      ' Show Last 2 entries. You can similarly write the log to a file.
      For i = evtLog.Entries.Count - 1 To lastlogtoshow - 2 Step -1
         currentEntry = evtLog.Entries(i)
         Console.WriteLine("Event Id is : " & currentEntry.EventID)
         Console.WriteLine("Entry type is : " & currentEntry.EntryType.ToString())
         Console.WriteLine("Message is :  " & currentEntry.Message & vbCrLf)
      Next
      evtLog.Close()

Scrittura dei registri


Per scrivere un log eventi, Ŕ necessario utilizzare il metodo WriteEntry della classe EventLog . Per scrivere correttamente nel registro eventi, assicurarsi che l'applicazione dispone di accesso in scrittura per il registro che si sta scrivendo. Per ulteriori informazioni sulle autorizzazioni necessarie per leggere e scrivere in event logs, visitare il seguente sito.

Protezione Ramification di registri eventi
http://msdn2.microsoft.com/en-us/library/4xz6w79h(vs.71).aspx
╚ necessario impostare la proprietÓ Source nell'istanza del componente EventLog prima di scrivere voci in un log. Quando il componente scrive una voce, il sistema verifica automaticamente che l'origine specificata Ŕ registrata nel log eventi che il componente sta scrivendo. Il sistema chiama quindi CreateEventSource se necessario. Per scrivere un log eventi, Ŕ necessario passare il nome del computer in cui si trova il log. Nell'esempio di codice riportato di seguito, la proprietÓ di MachineName della classe Environment determina il nome del computer locale:
      
  ' Check if the source exists 
      If Not EventLog.SourceExists("MySystemSource", System.Environment.MachineName) Then
         EventLog.CreateEventSource("MySystemSource", "System", System.Environment.MachineName)
      End If

      Dim evtLog As New EventLog("System", System.Environment.MachineName, "MySystemSource")

      'writing to system log, in the similar way you can write to other 
      'logs for which you have appropriate permissions to write
      evtLog.WriteEntry("warning is written to system log", EventLogEntryType.Warning, CInt(10001))
      Console.WriteLine("Log written to the system log.")
      evtLog.Close()

Cancella log


Quando un log eventi Ŕ pieno, si interrompe la registrazione di nuove informazioni di evento o inizia a sovrascrivere voci precedenti. Se si interrompe la registrazione di eventi, Ŕ possibile cancellare il Registro di voci esistenti e riavviare la eventi degli registrazione. Per cancellare le voci del registro eventi, Ŕ necessario autorizzazioni di amministratore per il computer che si trova il log in. Chiamare il metodo Clear sull'istanza del componente EventLog .

Nel seguente codice come cancellare un registro di esempio domonstrates:
      ' Create an EventLog instance and pass log name and MachineName on which the log resides
      Dim evtLog As New EventLog("Security", System.Environment.MachineName)
      evtLog.Clear()
      evtLog.Close()

Creare ed eliminare log personalizzati

Creare il registro personalizzato

Utilizzare il metodo CreateEventSource per creare il proprio gestore eventi personalizzato. Prima di creare il registro eventi, Ŕ possibile utilizzare il metodo SourceExists per verificare che l'origine che si utilizza non giÓ esiste e quindi chiamare CreateEventSource . Se si tenta di creare un log eventi che esiste giÓ, viene generato un errore di eccezione System.ArgumentException .

Nell'esempio di codice di seguito viene illustrato come creare un log personalizzato:
      ' Check if the log already exist
      If Not EventLog.SourceExists("MyOldSource", System.Environment.MachineName) Then
         ' Creating a new log
         EventLog.CreateEventSource("MyOldSource", "MyNewLog", System.Environment.MachineName)
         Console.WriteLine("New event log created successfully.")
      End If

Elimina il log personalizzato

Utilizzare il metodo Delete della classe EventLog per eliminare il registro eventi. Pi¨ di un'origine pu˛ scrivere un log eventi. Pertanto, prima di eliminare un log personalizzato, assicurarsi che non vi sono altre origini la scrittura in tale log.

Nell'esempio di codice riportato di seguito viene di illustrato come eliminare un log personalizzato:
      Dim logName As String = "MyNewLog"

      If EventLog.SourceExists("MyOldSource", System.Environment.MachineName) Then
         logName = EventLog.LogNameFromSourceName("MyOldSource", System.Environment.MachineName)
         EventLog.DeleteEventSource("MyOldSource", System.Environment.MachineName)
         EventLog.Delete(logName, System.Environment.MachineName)

         Console.WriteLine(logName & " deleted.")
      End If

Eventi di ricezione delle notifiche

╚ possibile ricevere una notifica di evento quando viene scritta una voce in un log specifico. Per eseguire questa operazione, implementare il gestore di eventi EntryWritten per l'istanza di EventLog . Inoltre, impostare la proprietÓ EnableRaisingEvents su true .

Nell'esempio di codice di seguito viene illustrato come ricevere le notifiche di eventi:
      If Not EventLog1.SourceExists("MySource", System.Environment.MachineName) Then
         EventLog1.CreateEventSource("MySource", "Application", System.Environment.MachineName)
         Console.WriteLine("CreatingEventSource")
      End If

      'Enable EnableRaisingEvents to true
      EventLog1.Log = "Application"
						EventLog1.EnableRaisingEvents = True
      EventLog1.WriteEntry("MySource", "EntryWritten event is fired", EventLogEntryType.Information)
   End Sub
Nota ╚ possibile solo ricevere le notifiche degli eventi quando le voci vengono scritte sul computer locale. Non Ŕ possibile ricevere le notifiche per voci scritte su computer remoti.


Elenco completo del codice

Imports System.Diagnostics
Imports System.Security
Imports System.ComponentModel
Imports System.IO

Public Class Form1
   Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

   Public Sub New()
      MyBase.New()

      'The Windows Form Designer requires this call.
      InitializeComponent()

      'Add any initialization after the InitializeComponent() call

   End Sub

   'Form overrides dispose to clean up the component list.
   Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
      If disposing Then
         If Not (components Is Nothing) Then
            components.Dispose()
         End If
      End If
      MyBase.Dispose(disposing)
   End Sub

   'Required by the Windows Form Designer
   Private components As System.ComponentModel.IContainer

   'NOTE: The Windows Form Designer requires the following procedure
   'It can be modified using the Windows Form Designer.  
   'Do not modify it using the code editor.
   Friend WithEvents EventLog1 As System.Diagnostics.EventLog
   Friend WithEvents btnListLog As System.Windows.Forms.Button
   Friend WithEvents btnReadLog As System.Windows.Forms.Button
   Friend WithEvents btnWriteLog As System.Windows.Forms.Button
   Friend WithEvents btnClearLog As System.Windows.Forms.Button
   Friend WithEvents btnCreateLog As System.Windows.Forms.Button
   Friend WithEvents btnDeleteLog As System.Windows.Forms.Button
   Friend WithEvents btnRecNotice As System.Windows.Forms.Button
   <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
      Me.btnReadLog = New System.Windows.Forms.Button()
      Me.btnWriteLog = New System.Windows.Forms.Button()
      Me.btnClearLog = New System.Windows.Forms.Button()
      Me.btnCreateLog = New System.Windows.Forms.Button()
      Me.btnDeleteLog = New System.Windows.Forms.Button()
      Me.btnRecNotice = New System.Windows.Forms.Button()
      Me.EventLog1 = New System.Diagnostics.EventLog()
      Me.btnListLog = New System.Windows.Forms.Button()
      CType(Me.EventLog1, System.ComponentModel.ISupportInitialize).BeginInit()
      Me.SuspendLayout()
      '
      'btnReadLog
      '
      Me.btnReadLog.Location = New System.Drawing.Point(48, 54)
      Me.btnReadLog.Name = "btnReadLog"
      Me.btnReadLog.Size = New System.Drawing.Size(152, 24)
      Me.btnReadLog.TabIndex = 0
      Me.btnReadLog.Text = "Read Event Logs"
      '
      'btnWriteLog
      '
      Me.btnWriteLog.Location = New System.Drawing.Point(48, 86)
      Me.btnWriteLog.Name = "btnWriteLog"
      Me.btnWriteLog.Size = New System.Drawing.Size(152, 24)
      Me.btnWriteLog.TabIndex = 1
      Me.btnWriteLog.Text = "Write Event Logs"
      '
      'btnClearLog
      '
      Me.btnClearLog.Location = New System.Drawing.Point(48, 118)
      Me.btnClearLog.Name = "btnClearLog"
      Me.btnClearLog.Size = New System.Drawing.Size(152, 24)
      Me.btnClearLog.TabIndex = 2
      Me.btnClearLog.Text = "Clear Logs"
      '
      'btnCreateLog
      '
      Me.btnCreateLog.Location = New System.Drawing.Point(48, 150)
      Me.btnCreateLog.Name = "btnCreateLog"
      Me.btnCreateLog.Size = New System.Drawing.Size(152, 24)
      Me.btnCreateLog.TabIndex = 3
      Me.btnCreateLog.Text = "Create Custom Log"
      '
      'btnDeleteLog
      '
      Me.btnDeleteLog.Location = New System.Drawing.Point(48, 182)
      Me.btnDeleteLog.Name = "btnDeleteLog"
      Me.btnDeleteLog.Size = New System.Drawing.Size(152, 24)
      Me.btnDeleteLog.TabIndex = 4
      Me.btnDeleteLog.Text = "Delete Custom Log"
      '
      'btnRecNotice
      '
      Me.btnRecNotice.Location = New System.Drawing.Point(48, 214)
      Me.btnRecNotice.Name = "btnRecNotice"
      Me.btnRecNotice.Size = New System.Drawing.Size(152, 24)
      Me.btnRecNotice.TabIndex = 5
      Me.btnRecNotice.Text = "Receive Event Notifications"
      '
      'EventLog1
      '
      Me.EventLog1.EnableRaisingEvents = True
      Me.EventLog1.Log = "Application"
      Me.EventLog1.MachineName = System.Environment.MachineName
      Me.EventLog1.SynchronizingObject = Me
      '
      'btnListLog
      '
      Me.btnListLog.Location = New System.Drawing.Point(48, 22)
      Me.btnListLog.Name = "btnListLog"
      Me.btnListLog.Size = New System.Drawing.Size(152, 24)
      Me.btnListLog.TabIndex = 6
      Me.btnListLog.Text = "List Event Logs"
      '
      'Form1
      '
      Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
      Me.ClientSize = New System.Drawing.Size(256, 266)
      Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.btnListLog, Me.btnRecNotice, Me.btnDeleteLog, Me.btnCreateLog, Me.btnClearLog, Me.btnWriteLog, Me.btnReadLog})
      Me.Name = "Form1"
      Me.Text = "Form1"
      CType(Me.EventLog1, System.ComponentModel.ISupportInitialize).EndInit()
      Me.ResumeLayout(False)

   End Sub

#End Region

   Private Sub btnReadLog_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReadLog.Click

      'logType can be Application, Security, System or any other Custom Log
      Dim logType As String = "Application"


      'In this case the EventLog constructor is passed a string variable for the log name and 
      'second argument mention the computer name from which you want to read the logs 
      'that you have appropriate permissions for
      Dim ev As New EventLog(logType, System.Environment.MachineName)

      Dim LastLogToShow As Integer = ev.Entries.Count
      If LastLogToShow <= 0 Then
         Console.WriteLine("No Event Logs in the Log :" & logType)
         Exit Sub
      End If

      ' read the last 2 records in the specified log 
      Dim i As Integer
      For i = ev.Entries.Count - 1 To LastLogToShow - 2 Step -1
         Dim CurrentEntry As EventLogEntry = ev.Entries(i)

         Console.WriteLine("Event ID : " & CurrentEntry.EventID)
         Console.WriteLine("Entry Type : " & CurrentEntry.EntryType.ToString())
         Console.WriteLine("Message :  " & CurrentEntry.Message & vbCrLf)
      Next

      ev.Close()

      ' Similarly, you can loop through all the entries in the log by using
      ' the entries collection, as shown in the following commented code.
      ' For Each entry In ev.Entries

      ' Next
   End Sub

   Private Sub btnWriteLog_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWriteLog.Click
      ' When writing to an event log, you must pass the machine name where 
      ' the log resides.  Here the MachineName Property of the Environment class 
      ' is used to determine the name of the local machine.  Assuming you have 
      ' the appropriate permissions, it is also easy to write to event logs on 
      ' other machines.

      'Check if the Source exists 
      If Not EventLog.SourceExists("MySystemSource", System.Environment.MachineName) Then
         EventLog.CreateEventSource("MySystemSource", "System", System.Environment.MachineName)
      End If
      Dim ev As New EventLog("System", System.Environment.MachineName, "MySystemSource")

      'Writing to system log, in the similar way you can write to other 
      'logs that you have appropriate permissions to write to
      ev.WriteEntry("Warning is written to system Log", EventLogEntryType.Warning, CInt(10001))
      MessageBox.Show("Warning is written to System Log")
      ev.Close()

   End Sub

   Private Sub btnClearLog_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClearLog.Click
      ' Create an EventLog instance and pass the log name and MachineName on which the log resides.
      Dim ev As New EventLog("Security", System.Environment.MachineName)
      ev.Clear()
      ev.Close()
   End Sub

   Private Sub btnCreateLog_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCreateLog.Click
      'Create the source, if it does not already exist.
      If Not EventLog.SourceExists("MyOldSource", System.Environment.MachineName) Then
         'Creating a new log
         EventLog.CreateEventSource("MyOldSource", "MyNewLog", System.Environment.MachineName)
         Console.WriteLine("CreatingEventSource")
      End If
   End Sub

   Private Sub btnDeleteLog_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDeleteLog.Click
      Dim logName As String = "MyNewLog"

      If EventLog.SourceExists("MyOldSource", System.Environment.MachineName) Then
         logName = EventLog.LogNameFromSourceName("MyOldSource", System.Environment.MachineName)
         EventLog.DeleteEventSource("MyOldSource", System.Environment.MachineName)
         EventLog.Delete(logName, System.Environment.MachineName)

         Console.WriteLine(logName & " deleted.")
      End If

   End Sub


   Private Sub btnRecNotice_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRecNotice.Click
      ' Create the source if it does not already exist.
      If Not EventLog1.SourceExists("MySource", System.Environment.MachineName) Then
         EventLog1.CreateEventSource("MySource", "Application", System.Environment.MachineName)
         Console.WriteLine("CreatingEventSource")
      End If

      'Enable EnableRaisingEvents to true
      EventLog1.Log = "Application"
						EventLog1.EnableRaisingEvents = True
      EventLog1.WriteEntry("MySource", "EntryWritten event is fired", EventLogEntryType.Information)
   End Sub

   Private Sub EventLog1_EntryWritten(ByVal sender As Object, ByVal e As System.Diagnostics.EntryWrittenEventArgs) Handles EventLog1.EntryWritten
      If e.Entry.Source = "MySource" Then
         Console.WriteLine("Entry written by my app. Message: " & e.Entry.Message)
      End If
   End Sub

   Private Sub btnListLog_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListLog.Click
      Dim remoteEventLogs() As EventLog
      'Gets logs on the local machine, give remote machine name to get the logs on the remote machine
      remoteEventLogs = EventLog.GetEventLogs(System.Environment.MachineName)

      Console.WriteLine("Number of logs on computer: " & remoteEventLogs.Length)

      Dim log As EventLog
      For Each log In remoteEventLogs
         Console.WriteLine("Log: " & log.Log)
      Next log
   End Sub
End Class

Nota ╚ necessario modificare il codice in Visual Basic 2005. Per impostazione predefinita, in Visual Basic due file per il progetto viene creata quando si crea un progetto Windows Form. Se il modulo denominato Form1, i due file che rappresentano il form sono denominati Form1.vb e Form1.Designer.vb. ╚ possibile scrivere il codice nel file Form1.vb. Progettazione Windows Form scrive il codice nel file Form1.Designer.vb. Progettazione Windows Form consente di utilizzato la parola chiave partial per dividere l'implementazione di Form1 in due file distinti. Questo comportamento impedisce che il codice generato per la finestra di progettazione venga frammisto con il codice.

Per ulteriori informazioni sui miglioramenti apportati nuovo linguaggio Visual Basic 2005, visitare il seguente sito Web MSDN (informazioni in lingua inglese):
http://msdn2.microsoft.com/en-us/library/ms379584(vs.80).aspx
Per ulteriori informazioni sulle classi parziali e Progettazione Windows Form, visitare il seguente sito Web MSDN:
http://msdn2.microsoft.com/en-us/library/ms171843.aspx

Verificare i risultati

Per verfiy i risultati, eseguire la procedura seguente:
  1. Consente di creare una nuova applicazione Windows utilizzando Visual Basic .NET o Visual Basic 2005.

    Per impostazione predefinita, viene creato Form1.vb .
  2. Sostituire il codice in Form1.vb con il codice nella sezione "Voce codice completato" di questo articolo.
  3. Dal menu debug , scegliere Avvia per eseguire l'applicazione.
  4. Eseguire azioni su Form1.vb .
  5. Per verificare il risultato, aprire Esplora Server. Per effettuare questa operazione, scegliere Esplora Server dal menu Visualizza .
  6. Espandere il nodo server e quindi espandere Il nome del computer .
  7. In Nome Computer , espandere il log eventi .

    Nota Il nodo server di Esplora Server non disponibile in Visual Basic .NET Edizione Education. ╚ possibile utilizzare eventi di Windows per visualizzare i risultati dell'applicazione.
  8. Utilizzare Esplora Server per verificare che tutte le procedure di questa procedura vengono eseguite correttamente.

Riferimenti

Per ulteriori informazioni, visitare il sito di Web di Microsoft:

Classe EventLog
http://msdn2.microsoft.com/en-us/library/system.diagnostics.eventlog(vs.71).aspx

ProprietÓ

Identificativo articolo: 814564 - Ultima modifica: mercoledý 14 novembre 2007 - Revisione: 2.7
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Chiavi:á
kbmt kbvs2005swept kbvs2005applies kbeventservice kbnetwork kbmanaged kbprogramming kbeventlog kbhowtomaster KB814564 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 814564
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com