Archivi categoria: Come fare per…

Script per configurare i permessi di una cartella di rete per un utente

Network_Folder Avete cartelle private di un utente in una posizione di rete condivisa e volete che solo l’utente possa vederle?

Ecco lo script che fa per voi!

Spesso capita che in una cartella condivisa gli utenti creino una cartella personale, ma in essa i permessi sono aperti a tutti gli utenti previsti nella cartella padre (amministratori compresi).
Come è possibile assegnare i permessi al solo utente in modo semplice, e renderlo anche proprietario della cartella in modo che nessuno possa accedere o modificare queste impostazioni?

I comandi TAKEOWN e ICACLS ci vengono in aiuto per velocizzare l’operazione.

Consiglio comunque di testare prima l’operazione su una cartella di prova e poi di procedere su quella definitiva.

Ecco lo script:

@echo off
set ERROLEVEL=0
cls
echo =============================================
echo      SCRIPT PER LA DEFINIZIONE DEI
echo   CORRETTI PERMESSI DI UNA CARTELLA UTENTE
echo =============================================
echo.
echo.
echo.
echo.
echo.
SET QUESTOUTENTE=%USERDOMAIN%\%USERNAME%

:IMPOSTAVARIABILI
set Dominio=
Set Utente=
Set Cartella=
echo Dominio
echo -------
set /p Dominio=Inserire il nome del dominio (niente per dominio corrente oppure %COMPUTERNAME% per utente locale):
if "%Dominio%"=="" set Dominio=%USERDOMAIN%
echo.
echo.
echo Utente
echo ------
set /p NomeUtente=Inserire il nome account utente:
echo.
echo.
echo Cartella
echo --------
:: La riga qui di seguito viene usata quando si ripete per piu utenti lo script
if "%Percorso%" NEQ "" echo Attualmente il percorso e' impostato su: %Percorso% && echo premere solo invio per confermarlo && echo.
set /p Percorso=Inserire il percorso della cartella si trova la cartella dell'utente in cui modificare i permessi (la cartella padre):
if NOT Exist %Percorso% goto ERRORE
echo.
echo.
echo Nome cartella a cui cambiare i permessi
echo ---------------------------------------
echo.
echo Cartelle presenti in %Percorso%:
echo ..................................................
FOR /F "tokens=4 delims= " %%A IN ('dir /ad %Percorso% ^|findstr /C:""^|findstr /V /E /C:"."') DO @echo %%A
echo ''''''''''''''''''''''''''''''''''''''''''''''''''
echo.
set /p Cartella=Scrivere il nome della cartella a cui bisogna cambiare i permessi (desktop, documenti o altro a seconda della necessita'):
echo.
echo.
cls
echo =============================================
echo ATTENZIONE!!!
echo =============================================
echo.
echo.
echo.

echo Saranno cambiati i permessi della cartella
echo %Percorso%\%Cartella%
echo impostando come proprietario l'utente %QUESTOUTENTE%
echo.
set /p Risposta=Si',No, Annulla (S/N/A):

if "%Risposta%"=="S" goto ESEGUI
if "%Risposta%"=="N" goto IMPOSTAVARIABILI
goto ANNULLA

:ESEGUI
cls
echo =============================================
echo SCRIPT PER LA DEFINIZIONE DEI
echo CORRETTI PERMESSI DI UNA CARTELLA UTENTE
echo =============================================
echo.
echo.
echo.
echo.
echo.
echo Cambio i permessi della cartella
echo %Percorso%\%Cartella%
echo con proprietario %DOMINIO%\%NomeUtente%
echo.
cls
echo.
TAKEOWN /f %Percorso%\%Cartella% /r /d S | findstr /I /V /B /C:"Operazione riuscita" | findstr /C:" "
echo.
echo Fine comando takeown
echo -------------------------------
echo.
echo L'utente %QUESTOUTENTE% e' diventato il proprietario della cartella %Percorso%\%Cartella%
echo.
pause
cls
echo.
ICACLS "%Percorso%\%Cartella%" /reset /T | findstr /I /V /B /C:"File elaborato"
echo.
echo Fine comando reset
echo -------------------------------
echo.
echo Sono stati resettati i permessi della cartella %Percorso%\%Cartella%
echo.
pause
cls
echo.
ICACLS "%Percorso%\%Cartella%" /grant:r "%DOMINIO%\%NomeUtente%":(OI)(CI)F /grant:r "SYSTEM":(OI)(CI)F /grant:r "%QUESTOUTENTE%":(OI)(CI)F | findstr /V /B /C:"File elaborato"
echo.
echo Fine comando assegna permessi
echo ------------------------------
echo.
echo La cartella %Percorso%\%Cartella% ha ora i permessi impostati per %DOMINIO%\%NomeUtente%,SYSTEM e %QUESTOUTENTE%
echo (L'utente amministratore %QUESTOUTENTE% sara' poi rimosso a fine script se non e' l'utente designato come proprietario)
echo.
pause
cls
echo.
ICACLS "%Percorso%\%Cartella%" /inheritance:r | findstr /I /V /B /C:"File elaborato"
echo.
echo Fine comando Imposta ereditarieta'
echo ----------------------------------
echo.
echo Attivata ereditarieta' sulla cartella %Percorso%\%Cartella%
echo.
pause
cls
echo.
ICACLS "%Percorso%\%Cartella%" /setowner "%DOMINIO%\%NomeUtente%" /T | findstr /I /V /B /C:"File elaborato"
echo.
echo Fine comando Imposta Proprietario
echo ----------------------------------
echo.
echo La cartella %Percorso%\%Cartella% ha ora come proprietario %DOMINIO%\%NomeUtente%
echo.
pause
cls
echo.
if "%username%"=="%NomeUtente%" (

echo Utente impostato = utente corrente. Lascio permessi intatti.
) else (
echo Rimuovo %QUESTOUTENTE% come utente con permessi
ICACLS "%Percorso%\%Cartella%" /remove "%QUESTOUTENTE%" | findstr /I /V /B /C:"File elaborato"
)
echo.
echo.
pause
goto FINE

:ANNULLA
echo =============================================
echo SCRIPT PER LA DEFINIZIONE DEI
echo CORRETTI PERMESSI DI UNA CARTELLA UTENTE
echo =============================================
echo.
echo. OPERAZIONE ANNULLATA
echo RILANCIARE LO SCRIPT
echo ED AGGIORNARE I PERMESSI
echo.
echo.
goto ENDOFSCRIPT

:ERRORE
echo =============================================
echo SCRIPT PER LA DEFINIZIONE DEI
echo CORRETTI PERMESSI DI UNA CARTELLA UTENTE
echo =============================================
echo.
echo. RISCONTRATO ERRORE. VERIFICARE I DATI
echo.
echo.
goto ENDOFSCRIPT

:FINE
cls
echo =============================================
echo SCRIPT PER LA DEFINIZIONE DEI
echo CORRETTI PERMESSI DI UNA CARTELLA UTENTE
echo =============================================
echo.
echo.
echo.
echo.
:ENDOFSCRIPT
echo.
echo Elaborazione terminata
pause

P.S.
Lo script deve essere lanciato da un utente con permessi amministrativi

Annunci

Creare un certificato digitale per uno script di Powershell

SSL certificate Quando lanciate uno script di Powershell vi dice che l’esecuzione è disattivata?
E’ perché il sistema operativo accetta di default solo script firmati digitalmente.
Come fare?

Se vi capita di ricevere l’errore della Figura 1 è perché il vostro file ps1 non ha la firma digitale.

Figura 1: Errore script ps1
Figura 1: Errore script ps1

Anzitutto bisognerà creare un certificato autofirmato per il proprio utente che ci servirà per firmare lo script:

$NomeCertificato = "Certificato autofirmato per firma script"
$NomeFilePfx = ".\CertificatoAutofirmato-"+(Get-Date -UFormat "%Y%m%d")+"-"+(Get-Date -UFormat "%H%M%S")+".pfx"
$LaMiaPassword = Read-Host "Inserire una password per il certificato autofirmato" -AsSecureString
New-SelfSignedCertificate -subject $NomeCertificato -Type CodeSigning  | Export-PfxCertificate -FilePath $NomeFilePfx -password $LaMiaPassword 
Write-Output "Creato certificato PFX $NomeCertificato"
Write-Output "Nome file: $NomeFilePfx"

Per verificare il certificato autofirmato:

certutil $NomeFilePfx

A questo punto si dovrà firmare digitalmente il file FileDaFirmare.ps1:

$MioCertificatoPfx = Get-PfxCertificate -FilePath $NomeFilePfx
Set-AuthenticodeSignature -PSPath .\FileDaFirmare.ps1 -Certificate $MioCertificatoPfx
Write-Host "Non dimenticare di salvare il file ps1 in formato UTF-8"

Ora il file di testo FileDaFirmare.ps1 avrà una nuova sezione contenente la firma:

SIG

Usare la Exchange Management Shell in remoto su Office 365

ems-cloud Vorreste usare la Exchange management shell anche su Office 365?

Può capitare di voler usare i comandi Powershell che normalmente utilizzate nella gestione del vostro Exchange “on premise” anche nella versione in cloud. Ma come si accede con powershell ad Office365?

Anzitutto salvate nella variabile $UserCredential le vostre credenziali di accesso amministrativo ad Office 365:

$UserCredential = Get-Credential

Ora lanciate il comando ed attendete che la sessione venga creata:

$SessioneO365 = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection

Una volta creata la connessione, per accedere alla sessione remota su Office 365 digitate:

Import-PSSession $SessioneO365 -DisableNameChecking

Se tutto è andato bene lanciando il seguente comando otterete:

PS C:\Windows\system32> Get-Recipient | Where-Object {($_.RecipientType -eq “UserMailbox”)}

Name                             RecipientType
----                             -------------
Utente 1                         UserMailbox
Utente 2                         UserMailbox
Utente 3                         UserMailbox

Attenzione:

A fine lavoro non lasciate la sessione aperta ma rimuovetela col comando:

Remove-PSSession $SessioneO365

Se poi volete anche accedere alle risorse di Office365 installate il modulo MSonline. Questo il comando:

[PS] C:\Windows\system32>Install-Module MSOnline

Archivio non attendibile
Stai installando i moduli da un archivio non attendibile. Se ritieni attendibile questo archivio, modifica il relativo
valore InstallationPolicy eseguendo il cmdlet Set-PSRepository. Vuoi installare i moduli da 'PSGallery'?
[S] Sì  [T] Sì a tutti  [N] No  [U] No a tutti  [O] Sospendi  [?] Guida (il valore predefinito è "N"): S

Quindi per connettersi:

[PS] C:\Windows\system32>Connect-MsolService -Credential $UserCredential

Per testarne il funzionamento si potrà usare il comando Get-MsolUser ottenendo:

[PS] C:\Windows\system32>Get-MsolUser | select UserPrincipalName, DisplayName

UserPrincipalName               DisplayName
-----------------               -----------
mrossi@acme.onmicrosoft.com     Mario Rossi
ebianchi@acme.onmicrosoft.com   Enzo Bianchi
pneri@acme.onmicrosoft.com      Paolo Neri
imarroni@acme.onmicrosoft.com   Ilaria Marroni

Se il comando Install-Module vi da errore sappiate che esso è disponibile solo dalla versione 3 di powershell. Per verificare che versione di Powershell e di Windows avete lanciate:

$PSVersionTable.PSVersion
(Get-WmiObject Win32_operatingsystem).caption
(Get-WmiObject Win32_operatingsystem).OSarchitecture

se in corrispondenza della colonna Major avrete un risultato <5.1 allora bisognerà installare una versione più recente del Windows Management Framework.

Ecco il link:

https://docs.microsoft.com/it-it/powershell/wmf/5.1/install-configure

Oppure per versioni più vecchie puoi installare il PackageManagement PowerShell Modules:

https://www.microsoft.com/en-us/download/confirmation.aspx?id=51451&6B49FDFB-8E5B-4B07-BC31-15695C5A2143=1

Attenzione: se lanciando un comando remoto ricevete l’errore:

Exception : System.Management.Automation.RemoteException: The syntax is not supported by this runspace.
This can occur if the runspace is in no-language mode.

c’è un problema con le policy che permettono l’esecuzione degli script Powershell. Chiudete la sessione col comando suindicato e verificatele col comando Get-ExecutionPolicy -List. Settatele poi secondo esigenza col comando Set-ExecutionPolicy (per testare potete usare il comando Set-ExecutionPolicy bypass che permette l’esecuzione di tutti gli script).

Installazione silente di UltraVNC nei client di un dominio

 

vnc Volete fare un’installazione non presidiata di VNC in uno o più PC del dominio?

Provate con UltraVNC!

Ecco come fare:

Scaricate UltraVNC (in questo caso ho usato la 1.0.9.6) e fate una installazione di test su un PC. Configuratelo completamente (pulsante destro sull’icona nella tray bar quindi Admin properties) in modo da creare un file .ini in c:\program files\vnc\ con tutte le impostazioni volute (password compresa).

Eccone un esempio:

[admin]
UseRegistry=0
MSLogonRequired=0
NewMSLogon=0
DebugMode=0
Avilog=0
path="C:\Program Files\vnc"
kickrdp=0
service_commandline=
DebugLevel=8
DisableTrayIcon=0
LoopbackOnly=0
UseDSMPlugin=0
AllowLoopback=0
AuthRequired=1
ConnectPriority=1
DSMPlugin=
AuthHosts=
AllowShutdown=1
AllowProperties=1
AllowEditClients=1
FileTransferEnabled=1
FTUserImpersonation=1
BlankMonitorEnabled=1
BlankInputsOnly=0
DefaultScale=1
CaptureAlphaBlending=0
BlackAlphaBlending=0
SocketConnect=1
HTTPConnect=1
XDMCPConnect=0
AutoPortSelect=1
PortNumber=0
HTTPPortNumber=0
IdleTimeout=0
RemoveWallpaper=1
RemoveAero=1
QuerySetting=2
QueryTimeout=0
QueryAccept=0
QueryIfNoLogon=0
primary=1
secondary=0
InputsEnabled=1
LockSetting=0
LocalInputsDisabled=0
EnableJapInput=0
FileTransferTimeout=30
DSMPluginConfig=
RemoveEffects=0
RemoveFontSmoothing=0
KeepAliveInterval=5
SocketKeepAliveTimeout=10000
[ultravnc]
passwd=HASHDELLAPASSWORDCRITTOGRAFATA
passwd2=000000000000000000
[poll]
TurboMode=0
PollUnderCursor=1
PollForeground=1
PollFullScreen=1
OnlyPollConsole=0
OnlyPollOnEvent=0
EnableDriver=0
EnableHook=1
EnableVirtual=0
SingleWindow=0
SingleWindowName=
MaxCpu=40
[Permissions]

ERRORI POWERSHELL???
Preparate poi un file batch install.bat per installare il programma ed il servizio, nonchè per l’avvio automatico.

@echo off
echo INSTALLA IL SERVIZIO
echo ====================
echo.
"C:\Program Files\vnc\winvnc.exe" -install
echo AVVIA IL PROGRAMMA
echo ==================
echo.
"C:\Program Files\vnc\winvnc.exe" 
echo ATTIVA L'AVVIO AUTOMATICO
echo =========================
echo.
reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Run\ /V "VNC" /t REG_SZ /D "\"C:\Program Files\vnc\winvnc.exe\"" /F
echo.
echo.
echo.
echo.
fine elaborazione
pause

Copiate l’intera cartella vnc presente nella cartella c:\program files nella stessa posizione nel PC di destinazione (eventualmente usando il percorso UNC \\NOMEPC\c$\program files\).

Usando PsExec (psexec \\NOMEPC cmd) lanciare lo script c:\program files\vnc\install.bat.

Da questo momento il PC sarà raggiungibile con VNC.

Attenzione: il firewall di Windows potrebbe bloccare la porta TCP 5900 per cui bisognerà eventualmente creare un’eccezione tramite le group policy o con altro metodo.

Disinstallare aggiornamenti di Windows da remoto

PC-KB Un aggiornamento automatico di Windows vi crea dei problemi sui PC del dominio?

Disinstallatelo da remoto!

Ecco come fare:

Per verificare sul PC se la patch KB31* è stata installata lanciate il comando:

Get-Hotfix -computername "NOME DEL PC REMOTO" | Where-Object { $_.HotfixID -like "KB31*" } | Sort-Object InstalledOn

Otterrete:

Source Description HotFixID InstalledBy InstalledOn
------ ----------- -------- ----------- -----------
NOME_PC... Security Update KB3163018 NT AUTHORITY\SYSTEM 08/03/2016 00:00:00
NOME_PC... Security Update KB3156016 NT AUTHORITY\SYSTEM 08/03/2016 00:00:00
NOME_PC... Security Update KB3150220 NT AUTHORITY\SYSTEM 08/03/2016 00:00:00
NOME_PC... Security Update KB3149090 NT AUTHORITY\SYSTEM 08/03/2016 00:00:00
NOME_PC... Security Update KB3159398 NT AUTHORITY\SYSTEM 08/03/2016 00:00:00

Per rimuovere, ad esempio, le KB3163018 e 3159398, lanciate il comando wusa in questo modo:

psexec \\"NOME DEL PC REMOTO" cmd
wusa.exe /uninstall /kb:3163018 /quiet /norestart /log
wusa.exe /uninstall /kb:3159398 /quiet /norestart /log
exit

Le opzioni quiet e norestart evitano rispettivamente l’uso della GUI (essendo da linea di comando) e il il riavvio non richiesto.

Aggiungere un disclaimer in calce ad ogni messaggio in uscita su Exchange/Office365

disclaimer La vostra posta è su Exchange o su Office365 e vorreste aggiungere un bel disclaimer in calce ad ogni messaggio che spedite?

Ecco come fare:

Bisognerà accedere all’amministrazione di Exchange. Nel caso il server non sia su Office 365 basterà accedere alla pagina di amministrazione aggiungendo al solito URL il suffisso /ecp (ad es. https://www.acme.com/ecp).
Nel caso l’hosting fosse su Office 365 allora potrete provare a collegarvi al sito https://outlook.com/ecp.
Qualora l’operazione non andasse a buon fine seguite i seguenti passaggi:

  1. Accedere alla pagina di amministrazione di Office 365
    Office365-admin-page
  2. Dal portale di Office 365 aprire la pagina di amministrazione di ExchangeOffice365-exchange-admin-page

A questo punto le operazioni sono identiche a prescindere dalla piattaforma.

  • Scorrere sino alla sezione Flusso di posta e selezionare Regole
    Office365-rules
  • Cliccare sul segno + per aggiungere una nuova regola e selezionare Applica le dichiarazioni di non responsabilità
    Office365-CreateDisclaimer
  • Ora bisognerà configurare tutte le voci della nuova regola:
    Office365-AddDisclaimerText

        1. Assegnare un nome alla regola
        2. Alla voce Applica questa regola se… selezionare Il destinatario si trova in… e poi selezionare Esterno dell’organizzazione, così come qui indicato:
          Office365-RecipientExternal
        3. Cliccare su Immetti il testo… ed inserire il testo del proprio disclaimer. Io ho usato questo:
          • Le informazioni contenute in questo messaggio e nei documenti allegati, sono da considerarsi strettamente riservate. Il loro utilizzo è consentito unicamente al destinatario del messaggio, per le finalità indicate. Qualora riceveste questo messaggio per errore, vi preghiamo di darne immediata notizia al mittente e di procedere alla sua distruzione (compresi gli eventuali allegati). Costituisce violazione alle disposizioni del D.Lgs. n. 196/2003 “Codice in materia di protezione dei dati personali”, qualsiasi utilizzo e/o conservazione dei dati ricevuti per errore.
            Information in this message and its attachments may be privileged or confidential. It is for the exclusive use of the intended recipient(s). If you are not one of the intended recipients, you are hereby informed that any use, disclosure, distribution, and/or copying of this information is strictly prohibited. If you receive this message in error, please notify the sender immediately and delete all copies of this message.

            Se non ti è necessario, non stampare questa e-mail – If you don’t need, don’t print this e-mail

Come ottenere rapidamente con Powershell la lista degli utenti di un dominio ed i relativi indirizzi e-mail di Exchange

Active-Directory-Logo Avete bisogno di una lista di utenti e dei relativi indirizzi e-mail presenti in Exchange? Usate Powershell sul domain controller!

In Active Directory vengono registrati tutti i dati degli utenti compresi gli indirizzi e-mail.

Quindi in un domain controller possiamo recuperare sia i nomi degli utenti, l’account ed anche l’indirizzo e-mail.

Get-ADUser -Filter * -Properties DisplayName, EmailAddress, Title | Select-Object -Property @{Name="Nome"; Expression = {$_.displayname}},@{Name="Indirizzo e-mail"; Expression = {$_.emailaddress}},@{Name="Account"; Expression ={$_.samaccountname}},@{Name="Stato"; Expression = {$_.enabled}}| where {($_."Indirizzo e-mail") -and ($_."Nome")}|Sort-Object Nome

Il risultato che otterremo è questo:

Nome                   Indirizzo e-mail                                  Account              Stato
----                   ----------------                                  -------              -----
Administrator          administrator@acmespa.it                          Administrator         True
Alessandro Rossi       Alessandro.Rossi@acmespa.it                       arossi               False
Antonella Bianchi      acquisti@acmespa.it                               abianchi              True
Antonio Neri           magazzino@acmespa.it                              aneri                 True
Emilio Di Maio         Emilio.DiMaio@acmespa.it                          edimaio               True
IT MAN                 itman@acmespa.it                                  itman                 True
Laboratorio            laboratorio@acmespa.it                            laboratorio           True