giovedì 12 aprile 2018

Creare un elenco telefonico Sharepoint (lista) con l'elenco degli utenti attivi in Active Directory ed Aggiornarlo automaticamente

Buongiorno a tutti,
 scrivo qui un nuovo script che mi ha tenuto avvinto un po'...

Il requisito è:
  1. Creare una lista (elenco) in Sharepoint che possa essere usata come rubrica dai dipendenti, nella quale inserire il numero di telefono e determinate altre proprietà dell'utente AD.
  2. Quando un nuovo utente viene creato, nell'arco di 24 ore l'elenco si aggiorna.
  3. Quando un utente viene eliminato o spostato in un'altra OU (fuori da quelle in cui intendiamo cercare) in Active Directory, deve essere altresì rimosso dalla lista.

Dati sulle versioni da me utilizzate:

  • Sharepoint 2010
  • Windows server 2008 R2
  • Active Directory Functional level: 2008 R2


Ecco lo script completo in un'unica soluzione, poi lo commentiamo:

##########################################################

#Add SharePoint
Add-PSSnapin Microsoft.SharePoint.PowerShell -EA SilentlyContinue
import-module activedirectory

#Variabili di Dove andare.
$webURL = "http:////"
$listName = "RubricaInterna"

#web = oggetto SP
$web = Get-SPWeb $webURL

#list = la lista.
$list = $web.Lists[$listName]


function UpdateUsersList{
param(
[parameter(Mandatory=$true)]
[System.Collections.ArrayList]$SearchBaseOUs
)
# ottengo tutti i personaggi.
$foundO=New-Object System.Collections.ArrayList
#itero su tutte le OU scelte...
foreach($SearchBaseOU in $SearchBaseOUs){
    $coll += get-aduser -Filter * -SearchBase $SearchBaseOU -Properties Department,EmailAddress,MobilePhone,telephoneNumber,sn,GivenName,SamAccountName,Description,physicalDeliveryOfficeName,Fax,info
}# chiudo la foreach delle baseOU

# ottengo tutti gli items in una lista
$items = $list.items
#itero su tutti gli utenti, se esiste l'utente allora faccio l'UPDATE, altrimenti faccio l'insert.
foreach($usr in $coll)
{

#itero su tutti gli elementi
$Titolo=$usr.SamAccountName.ToString()

# conversione delle proprietà

if ($usr.GivenName -ne $null) { $Nome=$usr.GivenName.ToString() } else {
     $Nome="" }
if ($usr.sn -ne $null) { $Cognome=$usr.sn.ToString() } else {
     $Cognome="" }
if ($usr.telephoneNumber -ne $null) { $Telefono=$usr.telephoneNumber.ToString() } else {
     $Telefono="" }
if ($usr.MobilePhone -ne $null) { $Cellulare=$usr.MobilePhone.ToString() } else {
     $Cellulare="" }
if ($usr.EmailAddress -ne $null) { $Email=$usr.EmailAddress.ToString() } else {
     $Email="" }
if ($usr.Description -ne $null) { $Descrizione=$usr.Description.ToString() } else {
     $Descrizione="" }
if ($usr.physicalDeliveryOfficeName -ne $null) { $Divisione=$usr.physicalDeliveryOfficeName.ToString() } else {
     $Divisione="" }
if ($usr.Fax -ne $null) { $Fax=$usr.Fax.ToString() } else {
     $Fax="" }
if ($usr.info -ne $null) { $MailUfficio=$usr.info.ToString() } else {
     $MailUfficio="" }
write-host "lavorando "$Cognome
foreach($item in $items)
{
#if ($item["Title"] -ne $null) { $ogg=$item["Title"].ToString() } else { $ogg="" }
# if ($item["Nome"] -ne $null) { $nomeO=$item["Nome"].ToString() } else { $nomeO="" }
# if ($item["Cognome"] -ne $null) { $cognomeO=$item["Cognome"].ToString() } else { $cognomeO="" }
if ($item["Email"] -ne $null) { $EmailO=$item["Email"].ToString() } else { $EmailO="" }

#se il title è uguale al SamAccountName dell'utente, allora update e segnatelo nella array degli oggetti trovati ed aggiornati..
# if($ogg -eq $uname)
# if(($nomeO -eq $Nome) -and ($cognomeO -eq $Cognome))
if($EmailO -eq $Email)
{
$foundO.Add($Email)
<# #>
$item["Title"]=$Titolo
$item["Nome"]=$Nome
$item["Cognome"]=$Cognome
$item["Telefono"]=$Telefono
$item["Cellulare"]=$Cellulare
$item["Email"]=$email
$item["Descrizione"]=$Descrizione
$item["Divisione"]=$Divisione
$item["Fax"]=$Fax
$item["Email Ufficio"]=$MailUfficio
$item.Update()
#>
write-host $Nome" "$Cognome" Aggiornato"
}


}# chiudo la foreach degli elementi


# elimino le variabili dell'oggetto AD, preparandomi per il prossimo ciclo.
# remove-variable -Name Titolo
remove-variable -Name Nome
remove-variable -Name Cognome
remove-variable -Name Telefono
remove-variable -Name Cellulare
remove-variable -Name email
remove-variable -Name Descrizione
remove-variable -Name Divisione
remove-variable -Name Fax
remove-variable -Name MailUfficio
}# chiudo la foreach degli utenti

# $foundO | sort-object

# SEcondo loop su $coll, per aggiungere i non trovati
$nontrovati = $coll | where { ($foundO -notcontains $_.EmailAddress) -and ($_.SamAccountName -ne $null) }
if($nontrovati -ne $null){

foreach($usr in $nontrovati)
{

# proprietà
$Titolo=$usr.SamAccountName.ToString()
if($usr.SamAccountName -ne $null){

if ($usr.GivenName -ne $null) { $Nome=$usr.GivenName.ToString() } else {
     $Nome="" }
if ($usr.sn -ne $null) { $Cognome=$usr.sn.ToString() } else {
     $Cognome="" }
if ($usr.telephoneNumber -ne $null) { $Telefono=$usr.telephoneNumber.ToString() } else {
     $Telefono="" }
if ($usr.MobilePhone -ne $null) { $Cellulare=$usr.MobilePhone.ToString() } else {
     $Cellulare="" }
if ($usr.EmailAddress -ne $null) { $Email=$usr.EmailAddress.ToString() } else {
     $Email="" }
if ($usr.Description -ne $null) { $Descrizione=$usr.Description.ToString() } else {
     $Descrizione="" }
if ($usr.physicalDeliveryOfficeName -ne $null) { $Divisione=$usr.physicalDeliveryOfficeName.ToString() } else {
     $Divisione="" }
if ($usr.Fax -ne $null) { $Fax=$usr.Fax.ToString() } else {
     $Fax="" }
if ($usr.info -ne $null) { $MailUfficio=$usr.info.ToString() } else {
     $MailUfficio="" }
<# #>
$newItem = $list.Items.Add()
$newItem["Title"]=$Titolo
$newItem["Nome"]=$Nome
$newItem["Cognome"]=$Cognome
$newItem["Telefono"]=$Telefono
$newItem["Cellulare"]=$Cellulare
$newItem["Email"]=$email
$newItem["Descrizione"]=$Descrizione
$newItem["Divisione"]=$Divisione
$newItem["Fax"]=$Fax
$newItem["Email Ufficio"]=$MailUfficio
$newItem.Update()
#>
    write-host $Nome" "$Cognome" Creato"
# remove-variable -Name Titolo
remove-variable -Name Nome
remove-variable -Name Cognome
remove-variable -Name Telefono
remove-variable -Name Cellulare
remove-variable -Name email
remove-variable -Name Descrizione
remove-variable -Name Divisione
remove-variable -Name Fax
remove-variable -Name MailUfficio

} #fine if samAccount not null
} # Fine foreach Usr

} # fine if non trovati non null

#TERZO loop, per rimuovere Quelli presenti nella lista ma non più presenti in AD.
$coll3 =New-Object System.Collections.ArrayList
foreach ($a in $coll) {
    $coll3.Add($a.SamAccountName.ToString())
}
#Qui purtroppo non funziona bene perchè mi da un errore : An error occurred while enumerating through a collection: Collection was modified; enumeration operation may not execute
# Allora faccio loop su una nuova lista “coll4” e seleziono un elemento per volta, mettendo anche un delay.
$coll4 = New-Object System.Collections.ArrayList

$web.Lists["RubricaInterna"].items | Where {$coll3 -notcontains $_.Title} | foreach {
$coll4.Add($_.Title)
}
foreach($colItem in $coll4){
# IN QUESTO MODO seleziona sempre una entry per volta e poi fa l'UPDATE.
$web.Lists["RubricaInterna"].items | Where {$_.Title -eq $colItem} | Foreach { $_.Delete()}
$web.Lists["RubricaInterna"].Update()
start-sleep 3000
}

}# fine function

$OUs=New-Object System.Collections.ArrayList
$OUs.Add("OU=Personale,OU=Utenti,OU=VERONA,DC=,DC=local")
$OUs.Add("OU=Personale,OU=Utenti,OU=BOLZANO,DC=,DC=local")
$OUs.Add("OU=Personale,OU=Utenti,OU=AGENTI,DC=,DC=local")


UpdateUsersList($OUs)

##########################################################

mercoledì 30 aprile 2014

Configurare un secondo tunnel VPN con openvpn su zeroshell 1.0 beta 16 per permettere la connessione di Android senza root - Parte 1, della configurazione di OpenVPN e Android

Buongiorno a tutti.

Oggi sono finalmente riuscito a configurare quello che è nel titolo del post e che volevo fare da un po' di tempo...

Ho un piccolo box con l'ottimo zeroshell (zeroshell.org, da qui in avanti "ZS") che mi funge da firewall.
Avevo in precedenza utilizzato la sua ottima web interface per mettere a disposizione una VPN (Virtual Private Network) a dei client windows e Android (ma solo con root e busybox+openvpn).

Il motivo per cui non si potevano creare tunnel con Android non root è che in tal caso il tipo di interfaccia di rete virtuale deve essere "TUN", mentre ZS utilizza "TAP" e non c'è modo di cambiarlo.

Se pensate siano solo delle simpatiche onomatopee, rinunciate a leggere il resto. :-)

Allora, quello che vi dirò qui è un bel po' machinoso e complicato, ma la sola lettura del post e la comprensione di alcuni parametri serviranno a meglio comprendere parecchie cose su OpenVPN ed il suo modo di funzionare, nonchè su come rendere permamenti i cambiamenti (questi o altre personalizzazioni che potreste decidere di fare).

Nota per i non-informatici: se avete già mal di testa non continuate la lettura. Non mi assumo nessuna responsabilità di alcun genere per mal di testa formato famiglia ne' mi potrete addebitare spese per farmaci o cure neurologiche o di altro tipo....





OK, a parte gli scherzi, cominciamo. Allacciate le cinture.

Allora, siccome openvpn permette la creazione di più VPN contemporaneamente, mi è saltato il pallino che CI DEVE ESSERE UN MODO per permettermi di tenere su entrambe le device (TUN e TAP) senza quindi andarmi a rimodificare tutte le config. dei clients...
Questo articolo potrebbe anche titolare:
Come creare una VPN per Android con OpenVPN
Come permettere più tunnel contemporaneamente con OpenVPN / Zeroshell

ma, per motivi legati al tempo, diciamo che "unifico tutto" (unifico tutto?)

Dopo varie prove ho creato questi file di configurazione, per il server e per il client, rispettivamente:

############## SERVER FILE ####################
#imposto la device virtuale per essere TUN
dev tun
#ascolto per connessioni che vengono dall'interfaccia ESTERNA DEL FIREWALL
local 172.17.104.2

#modalità server, ovvio
mode server

#Transport-Layer-Security server. Cioè crittografa tutte le trasmissioni.
tls-server

#qui definisco la RETE sulla quale dovranno essere assegnati gli IP dei clients
server 192.168.250.0 255.255.255.0
# protocollo tcp-server
proto tcp-server

#porta 1195 (quella di default 1194 è già usata dall'altro tunnel)
port 1195

#una volta startato "demonizzati", ovvero diventa un demone in esecuzione e rilascia il comando da shell.
daemon VPNH2Ltun



#Qui imposto i vari certificati: CA, certificato per la TLS, ...
ca /DB/_DB.002/var/register/system/openvpn/Auth/X509/CAFile
cert /DB/_DB.002/var/register/system/openvpn/TLS/cert.pem
key /DB/_DB.002/var/register/system/openvpn/TLS/key.pem
dh /etc/ssl/dh.pem

#_DB.002 è il nome del vostro profilo attivo


# verbosity 5, perchè voglio vedere TUTTO nei log .
verb 5
push "redirect-gateway def1"
push "dhcp-option DNS 192.168.250.254"

# 192.168.250.254 è l'IP di ZS sulla interfaccia virtuale VPN principale.
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
comp-lzo
status /var/log/tmpOVPN/openvpn-status.log
log /var/log/tmpOVPN/openvpn.log
log-append /var/log/tmpOVPN/openvpn.log

client-cert-not-required
auth-user-pass-verify /root/kerbynet.cgi/scripts/ov_pw_auth via-env
username-as-common-name
comp-lzo
#ifconfig-pool 192.168.250.1 192.168.250.253 255.255.255.0
push dhcp-option DNS 10.36.40.242
push route remote_host 255.255.255.255 net_gateway 1
push route X.X.X.X 255.255.255.0
push route 172.17.100.0 255.255.255.0
push route 172.17.101.0 255.255.255.0
push route 172.17.102.0 255.255.255.0
push route 172.17.103.0 255.255.255.0
push route 172.17.105.0 255.255.255.0
push route 192.168.111.0 255.255.255.0 

# queste sono le VOSTRE subnet che volete siano raggiunte tramite la VPN.
client-connect /root/kerbynet.cgi/scripts/ov_connect
client-disconnect /root/kerbynet.cgi/scripts/ov_disconnect
mute 3
duplicate-cn
script-security 3

###############################################



########## CLIENT FILE #########################
remote Z.Z.Z.Z 1194
proto tcp


#Z.Z.Z.Z è l'IP PUBBLICO DEL VOSTRO ZS

auth-user-pass
# Chiaramente devi poi andare (in openvpn per android) a selezionare il file .pem che ti sei esportato da zeroshell..
ca CA.pem

# due righe commentate
;cert client.pem
;key  client.pem

comp-lzo
verb 3
mute 20
resolv-retry infinite
nobind
client
dev tap
persist-key
persist-tun


###############################################

Leggendo i commenti potrete apprendere cosa significano i vari  parametri.


a questo punto non ci resta che andare in Zeroshell e lanciare il tunnel con openVPN dalla SHELL (dovete abilitare SSH e loggarvi), per vedere se funziona.... ma questo lo vedremo nel prossimo articolo... :-)

Installazione automatica (unattended, silent, automatic) di Office 2013 Home & Business, Standard, Professional, Pro Plus, Home & student, 365, etc etc etc

Buongiorno a tutti, :-)


Oggi parliamo di utilizzo di Office 2013 in ambito Aziendale, e più specificamente di come sia possibile automatizzare l'installazione di Office sui PC.

Dovete sapere che (come in passato) esistono molte, moltissssssime versione di Office.

  • Home & Business
  • Home & Studend
  • Standard
  • Professional
  • Pro Plus
  • ......
Esistono anche molte moltisssssssime licenze diverse:

  • Retail (la scatola comprata al negozio, hai presente? :-) )
  • Volume License (licenze a chiave singola per volumi elevati (solitamente non richiede attivazione)
  • Software Assurance (contratto Con Microsoft per la fornitura di software sotto una licenza particolare)
  • Multiple Activation Key (chiave singola per attivazioni multiple. Quantità predefinita)
  • Key Management System (server in locale nella vs rete che si occupa della gestione licenze).
  • ....


Poi dovete sapere che esistono molti, moltissssssssssssssssssimi modi di automatizzarne l'installazione. Alcuni compatibili con talune edizioni ed altri compatibili solo con altre....

Questi i metodi:

  1. Creare un file XML con le configurazioni (seguendo questo schema) e passarlo all'installer di Office, distribuendolo via script .
  2. Creare un file .msp con lo strumento Office Configuration Tool e distribuirlo via GPO (policy) o via script. (ulteriori info qui)
  3. Lo strumento Office Deployment Tool for Click-to-Run, creando un file XML con le configurazioni (diverse, vedi QUI) e passadolo allo strumento. Questa modalità vi permette anche di SCARICARE da Microsoft in AUTOMATICO i file necessari (scarica la versione che definite nel tag PRODUCT, all'attributo ID). Questo metodo è supportato per queste versioni (scrivo i ProductIDs):
    • O365ProPlusRetail
    • VisioProRetail
    • ProjectProRetail
    • SPDRetail (SharePoint Designer)
    • AccessRetail
    • ExcelRetail
    • GrooveRetail
    • HomeBusinessRetail
    • HomeStudentRetail
    • InfoPathRetail
    • LyncEntryRetail
    • LyncRetail
    • ProfessionalRetail
    • O365HomePremRetail
    • O365SmallBusPremRetail
    • OneNoteRetail
    • OutlookRetail
    • PowerPointRetail
    • ProjectStdRetail
    • PublisherRetail
    • VisioStdRetail
    • WordRetail
  4. I parametri MSIEXEC (per le installazioni che ce l'hanno l'msi...).
  5. Scardinare il file .msi e modificarlo secondo i nostri bisogni ... un po' estremo... 
  6. .....


insomma: c'è una CONFUSIONE PAZZESCA!!!!

Disabiguiamo:

Metodo1:
quando usarlo:
Lo puoi usare con le versioni in teoria non retail, ma scaricate. Quindi tutte le altre.
Puoi anche omettere le informazioni di Chiave di attivazione (CD Key), che sarebbero contenute nel TAG e poi attivare il software dopo inserendola a mano.

in pratica:
Crei il file XML. c'è un esempio nella cartella di installazione di office che si chiama config.xml e + precisamente nella sottocartella con il nome della versione (es: standard.ww)
Leggi la guida di riferimento che ho linkato così sai tutto ciò che puoi fare.

esempio (l'ho creato io e l'ho pure testato su una versione standard):
ARPCOMMENTS="Office 2013 installato da Sistemi Informativi e Processi Della mia azienda"
ARPCONTACT=SupportoIT@miaAzienda.it"
ARPHELPLINK="http://SharepointTicket/sip"
ARPHELPTELEPHONE="telefonoAssistenza"
/>
\\altroserver\share\Office 2013 64Bit
" />



Metodo 2:
quando usarlo:
Quando vuoi distribuire con GPO o comunque vuoi creare un pacchetto autoeseguibile con le tue configurazioni specifiche.
in pratica:
  • esegui setup.exe /admin e segui le istruzioni grafiche per impostare tutti i parametri. 
esempio:
non serve: lancialo e vedrai.

Metodo 3:
quando usarlo:
Quando hai una installazione Retail (come l'economico Home & Business, che ho appunto scelto per la mia rete)
in pratica:
  • scarichi il Office Deployment Tool for Click-to-Run dal sito MS.
  • crei un XML (leggermente diverso dal metodo 1), che contiene alcune info. poi lanci
  • \setup.exe /download /configure
  • Questo gli fa SCARICARE i files di installazione necessari per la versione che hai scelto e messo nell'attributo ID del tag Product (es:  )
esempio (l'ho testato giusto oggi e funziona alla grande):
 
 
     
             
   
 
 
 
 
ARPCOMMENTS="Office 2013 installato da Sistemi Informativi e Processi Della mia azienda"
ARPCONTACT=SupportoIT@miaAzienda.it"
ARPHELPLINK="http://SharepointTicket/sip"
ARPHELPTELEPHONE="telefonoAssistenza"
 />
 
 
 




E lo script per l'installazione?
Eccolo:
@echo off
 SET instPath="\\das-fs01\utility\UtilitySoftware\Microsoft Office\Office 2013\Autodeploy"

REM scelgo la architettura processore
if %PROCESSOR_ARCHITECTURE%==AMD64 (
) ELSE (
 SET ARCHE=_32
)

REM leggi versione isntallata di Word
for /F "usebackq delims=. tokens=1,2,3,4,*" %%a IN (`reg query "HKEY_CLASSES_ROOT\Word.Application\CurVera"`) Do (
if not .%%c==. (
set versioneOff=%%c
)
)

set /A versioneOff=%versioneOff%+0
REM echo %versioneOff%
REM se già installato skip
// se la versione installata è >= 15 allora non installare niente.
if /I %versioneOff% GEQ 15 (
goto :giaInst
)

echo versione  attuale = %versioneOff%, sto installando Office 15 (2013)

REM se 32bit viene lanciato con config_click_to_run_32.xml, altrimenti con config_click_to_run.xml, all'interno dei quali ho scelto la architettura del software.
"%instPath:"=%\setup.exe" /configure "%instPath:"=%\config_click_to_run%ARCHE%.xml"

goto fine
:giaInst
echo inst. office non necessaria
:fine


Beh. spero di essere stato utile a qualcuno. Io ho perso qualche ora a capire 'sti stranfieri...

Ciao! :-)

giovedì 31 ottobre 2013

Come creare un connettore che permetta il relay solo agli utenti autenticati tramite SMTP in exchange 2010

A volte ci si trova nella condizione di dover "aprire una porticina" a quella rete DMZ, si quella là dimenticata da Dio....
...anche se la nostra (mia) paranoia ci fa prudere da ogni parte del corpo, dobbiamo farlo.

Ecco un semplice modo per far prudere un po' meno e mandare a spasso quell'omino che continua a ripeterti "e se..." (oltre a smanettare una settimana sul firewall layer7, finchè non siamo rassicurati, ovviamente ;-) ).

Creiamo si, un connettore, per quell'host di quella rete, ma almeno richiediamo utente e password per poter spedire la posta all'esterno del nostro dominio... (non ci piacerebbe essere inseriti in una black-list di spammers, ve lo assicuro. Uscirne è comunque, sempre, critico.)

Ma come si fa? Ecco allora la mini guida che svela questi piccoli segreti del sistemista:
Dalla Exchange Management Console, recati su Microsoft Exchange on-premises (tuo org name).

Crea un nuovo ocnnettore di ricezione sul server che vai a puntare sulla porta 25, in server configuration->Hub transport-> il server che scegli (se ne hai uno non puoi sbagliare...).

Pannello a destra, quindi, clicca su: "new Receive Connector".

Nella finestra che si apre (fig 1), scegli un nome, poi NEXT


fig 1

Se vuoi restringere gli indirizzi su cui il server ASCOLTA sulla porta 25, puoi operare sulla parte "local Network Settings" (fig 2) in alto, rimuovendo  "all available ipv4" e aggiungendo un IP disponibile alla volta. altrimenti lascia "all".
Scegli quindi il nome con cui il server si presenterà ai client che si connettono su questo connettore. poi NEXT
fig 2


Nella scheda "Remote Network Settings"  (fig 3) scegli quali indirizzi IP  o reti sono abilitati a connettersi a questo connettore. ATTENZIONE: se degli indirizzi sono già presenti in altri connettori NON PUOI metterli qui. Poi NEXT.
fig 3


A questo punto clicca su "New" ed il tuo connettore è creato, ma dovrai fare delle altre modifiche prima di usarlo, quindi:

cliccaci sopra col destro e seleziona properties. (fig 4)
fig 4

A questo punto vai sulla scheda Authentication  (fig 5) e metti la spunta solo su Basic Authentication...
fig 5

poi vai sulla scheda Permission Groups (fig 6) e metti la spunta su "anonymous users" e su "Exchange Users".
ATTENZIONE: in questa ultima scheda si specifica chi può CONNETTERSI al connettore, non c'entra con la autenticazione che poi serve per fare relay.
fig 6


Ultima cosa: devi lanciare il comando powershell per permettere il relay attraverso questo connettore agli utenti o gruppi selezionati.
Ti consiglio di fare un gruppo in Active Directory e di usare quello, in modo da non dover rilanciare il comando powershell ogni volta che si aggiungono o si tolgono utenti a quel diritto.

Creato? allora il comando (da lanciare in Exchange Management Shell, ovviamente) è:

Get-ReceiveConnector ""| Add-ADPermission -User "" -ExtendedRights "ms-Exch-SMTP-Accept-Any-Recipient".

Fatto questo puoi proseguire e testare che tutto funzioni.


NOTA:
ATTENZIONE: per qualche motivo l'invio autenticato in SMTP da .NET C#, se si specificano lo user e la pw con la classe SmtpClient, passandoglieli come System.Net.NetworkCredential non FUNZIONA.
Per fare funzionare la classe dovrai specificare i parametri nel web.config sotto system.net->mailSettings.

Esempio di codice che NON FUNZIONA:
        nei sorgenti:
            SmtpClient smtpClient = new SmtpClient("hostnameServerOppureIP", 25);
                       
            smtpClient.Credentials = new System.Net.NetworkCredential("username", "password", "dominio");
            smtpClient.UseDefaultCredentials = true;
            smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
            smtpClient.EnableSsl = false;
                   
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress("prova@dominio.it", "il mio portale");
            mail.To.Add(new MailAddress("destinatario@ilSuoDominio.com", "destinatario@ilSuoDominio.com"));
            mail.Subject = "subject di test";
            mail.Body = "body di test";
            smtpClient.Send(mail);
           
           
           
Esmpio di codice che FUNZIONA:
        nei sorgenti:
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress("prova@dominio.it", "il mio portale");
            mail.To.Add(new MailAddress("destinatario@ilSuoDominio.com", "destinatario@ilSuoDominio.com"));
            mail.Subject = "subject di test";
            mail.Body = "body di test";
            SmtpClient smtpClient = new SmtpClient();
            smtpClient.Send(mail);
       
        nel web.config:
            ...
           
               
                   
                       
                   

               

           

            ....
           
           
           
P.S. se qualcuno sa PERCHE' di preciso, mi erudisca, per favore. io ho provato a cambiare ogni parametro, mettere in base64 user e pw (per assurdo, perchè dovrebbe arrangiarsi lui), mettere il dominio nel nome utente, useDefault... false, e chi più ne ha più ne metta.


Ciao a tutti e buona serata!

martedì 19 marzo 2013

Controllare reports CSV che arrivano per e-mail (in una sottocartella di inbox)

Eccoci qui di nuovo a scrivere di un interessante script che mi sono trovato a fare...

Oggi parleremo di come sia possibile automatizzare il controllo di reports che vi arrivano in formato CSV nella posta elettronica.
Ovviamente, con piccolissime modifiche, sarà possibile controllare qualsiasi formato di allegato o matchare le parole importanti nel corpo del messaggio...

Chi fa di mestiere l'informatico, l'amministratore di rete o altro, sa per esperienza che moltissimi software (backup, antivirus centralizzati, antispam, etc...) hanno, integrata di default, la possibilità di inviare un report periodico per e-mail, spesso allegandolo in un formato "analizzabile" come il CSV.

Ma che noia leggersi il "giornale dei reports" tutti i giorni, cercando con gli occhi le stesse cose e facendo fatica mentale...
Meglio automatizzare!

Ecco lo script: