martedì 26 maggio 2020

Errore quando si cerca di cambiare la password ad un managed account in Sharepoint

Il problema in questione ha più soluzioni come indicato qui. Ma in realtà e di solito ve ne accorgete quando dovete creare una nuova Web Application, semplicemente avete cambiato la password dell'utente su AD e vi siete 'scordati' di cambiarla in Sharepoint. L'unico modo veramente sicuro di cambiarla è di scegliere l'opzione 'Use Existing Password' e reinserire la password AD dell'utente, sia da Central Administration che da Powershell


Set-SPManagedAccount -identity "MYDOMAIN\MYUSER" 
-ExistingPassword (Convertto-Securestring "MYPASSWORD" -AsPlainText -Force)

martedì 19 maggio 2020

Convertire una virtual machine VMWare in Hyper-V

Il metodo descritto qui si applica ad una virtual machine che risiede fisicamente sul nostro PC. Il procedimento è abbastanza semplice.

1) Prima di tutto scaricate ed installate Microsoft Virtual Machine Converter 3.0. Questo tool (di cui trovate un esauriente tutorial qui) mette a disposizione delle nuove cmdlet powershell

2) Aprite una finestra powerhell con diritti di Amministratore ed eseguite i seguenti comandi

Import-Module ‘C:\Program Files\Microsoft Virtual Machine Converter\MvmcCmdlet.psd1’
ConvertTo-MvmcVirtualHardDisk -SourceLiteralPath “C:\miodisco.vmdk” -DestinationLiteralPath “C:\miodisco.vhd” -VhdType FixedHardDisk -VhdFormat Vhd

Per una VM di tipo "Generation 2" con supporto UEFI, utilizzare la riga di comando qui sotto

ConvertTo-MvmcVirtualHardDisk -SourceLiteralPath “C:\miodisco.vmdk” -DestinationLiteralPath “C:\miodisco.vhdx” -VhdType DynamicHardDisk -VhdFormat Vhdx

3) E qui si presenta subito un problema. L'esecuzione di questo comando quasi sempre risulta in un errore del tipo "ConvertTo-MvmcVirtualHardDisk : The entry 1 is not a supported disk database entry for the descriptor"

4) Sostanzialmente l'errore di cui al punto 3 indica che il descrittore del disco in formato vmWare NON è compatibile con Hyper-V. Per ovviare a questo problema (un tutorial più completo si può trovare qui) si può utilizzare un tool denominato dsfok che estrae e reinserisce il decrittore del disco vmWare. Una volta installato eseguite il seguente comando

dsfo.exe "C:\miodisco.vmdk" 512 1024 "C:\descriptor.txt"

Il file estratto ha un formato come quello mostrato qui sotto. Vanno commentate, preponendo il simbolo '#', le righe che danno errore al di sotto del rigo "#DDB" (nel mio caso tutte)

# Disk DescriptorFile
version=1
encoding="UTF-8"
CID=e52f6c81
parentCID=ffffffff
createType="monolithicSparse"

# Extent description
RW 524288000 SPARSE "SharePoint 2013.vmdk"

# The Disk Data Base
#DDB

ddb.adapterType = "lsilogic"
ddb.geometry.cylinders = "32636"
ddb.geometry.heads = "255"
ddb.geometry.sectors = "63"
ddb.longContentID = "952846014b76d094654aa2b5e52f6c81"
ddb.toolsInstallType = "1"

ddb.toolsVersion = "10309"

Dopo le modifiche eseguite il seguente comando

dsfi.exe "C:\miodisco.vmdk" 512 1024 "C:\descriptor.txt"

e rieseguite il comando al punto 2.

5) A questo punto aprite Hyper-v Manager e create una nuova virtual machine. 
Quando arrivate al passaggio "Connetti disco rigido virtuale", scegliete l'opzione "Usa un disco rigido virtuale esistente" e cercate il file VHD appena creato.

6) Fate partire la vostra virtual machine e controllate che tutto sia andato bene


martedì 12 maggio 2020

Come creare dinamicamente un array JSON in typeScript

Il codice è mostrato qui sotto. L'array jsonFields può essere creato dinamicamente se non si conoscono a priori i nomi dei campi (per esempio se si converte il risultato di una chiamata ad un web service).

 let jsonData: any = [];
 //QUESTO ARRAY PUO' ESSERE DINAMICO 
 let jsonFields: string[] = ["Field1","Field2","Field3"]; 
               
        listaDiDatiDaTrasformareinJSON.forEach(
            (row) => {
                let arrayIndex: number = 0;
                let jsonItem: any = {};
                row.forEach(
                    (field) => {
                        let fieldName = jsonFields[arrayIndex];
                        jsonItem[fieldName] = field;
                        arrayIndex++;
                    }
                )
                jsonData.push(jsonItem);
            }
        );

giovedì 16 aprile 2020

Dashboard COVID-19 Italia

Questo report è una rielaborazione e un arricchimento della dashbord italiana ufficiale del ministero della Salute reperibile qui

Le pagine dalla 11 alla 13 contengono esempi di custom visuals creati con pbiviz (vedi questo post).



Disponibile anche sulla community Power BI a questo link

lunedì 16 marzo 2020

Collegare Power BI Desktop ad un Server Analysis Services in un dominio differente

Se avete il vostro Analysis Services attestato su un server in un dominio differente dal vostro, quando tentate di connettervi con Power BI Desktop avrete come risultato:

  1. "Timeout" se tentate la Live Connection
  2. "We couldn't Authenticate" se tentate la Import

La soluzione è lanciare da un Command Prompt eseguito come Amministratore il seguente script

runas /netonly /user: DOMAIN\USERNAME "C:\Program Files\Microsoft Power BI Desktop\bin\PBIDesktop.exe"

La password vi verrà chiesta contestualmente. Quanto detto vale per Power BI Desktop. Per l'app Power BI scaricata dal Microsoft Store, andrebbe eseguita come differente utente (Run as different user) fornendo le credenziali di dominio necessarie

venerdì 17 gennaio 2020

Come sistemare un campo Taxonomy che dia l’errore “The SPListItem being updated was not retrieved with all taxonomy fields” in fase di update


  1. Con uno script powershell creare un CSV con l'URL delle pagine contenenti il campo in questione e il valore dello stesso (un esempio è riportato in fondo a questo post)
  2. Rimuovere il campo dalla Document Library "Pages"
  3. Rimuovere il campo dai content types che lo contengono
  4. Cancellare la Site Column dalla site collection
  5. Ricrearla con lo stesso Internal Name
  6. Aggiungerla di nuovo tutti i Content Type interessati
  7. Reinserire i valori nelle pagine con uno script powershell che legga il file creato al punto 1 (lo script di inserimento lo lascio a voi, io l'ho già scritto, ma è un po' troppo corposo per inserirlo nel post)

filter Get-PublishingPages {
       $pubweb = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($_)
       $query = new-object Microsoft.SharePoint.SPQuery

       $query.ViewAttributes = "Scope='Recursive'"
       $pubweb.GetPublishingPages($query)
}

$str = "https://[sitecollectionURL]"
$site = Get-SPSite -Identity $str

$web = $site.RootWeb

$web | Get-PublishingPages | select Uri, @{Name="[Display Name colonna]";Expression={$_.ListItem["[Internal Name colonna]"]}}| Export-CSV -Append  "[Path File CSV]"

Script di esportazione valori taxonomy

giovedì 2 gennaio 2020

ClientCallableSettings questi sconosciuti

Che bello utilizzare il CSOM su Sharepoint On Premise, giusto? Poche righe di Javascript e sul browser faccio tutto quello che facevo con il Server Object Model. Peccato però che il CSOM controlli prima che diritti ha l'utente e normalmente nei vostri (nostri) portali Web, l'utente è Anonimo. Così avete errori del tipo: "Error: The Method “GetItems” of the type “List” with id “{Lists’s Guid}” is blocked by the administrator on the server". In questo caso vi viene in aiuto la classe ClientCallableSetting. Con poche righe di Powershell potete abilitare l'utente anonimo ad eseguire get_items.

$web = Get-SPWebApplication -Identity http://[your web address]
$web.ClientCallableSettings.AnonymousRestrictedTypes.Remove
([Microsoft.SharePoint.SPList],"GetItems")
$web.Update()

Se poi vi pentite della vostra decisione, potete ritornare sui vostri passi:

$web = Get-SPWebApplication -Identity http://[your web address]
$web.ClientCallableSettings.AnonymousRestrictedTypes.Add
([Microsoft.SharePoint.SPList],"GetItems")
$web.Update()