Kategorie: Powershell

  • Identifizieren defekter Disks in einem Storage Spaces Direct Cluster (S2D) mit PowerShell

    Das folgende PowerShell-Skript ermittelt defekte Disks in einem Storage Spaces Direct Cluster und zeigt den Namen des Clusterknotens, in dem die Disk verbaut ist:

    $errordisks=@()
    
    foreach($ed in Get-PhysicalDisk |? Operationalstatus -ne 'OK'|Sort-Object FriendlyName)
    {
        $Nodename=($ed|Get-StorageScaleUnit).friendlyname
    
        $cobject = [PSCustomObject]@{
            FriendlyName = $ed.FriendlyName
            SerialNumber = $ed.SerialNumber
            MediaType=$ed.MediaType
            OperationalStatus=$ed.OperationalStatus
            Size=$ed.Size/1GB
            HealthStatus=$ed.HealthStatus
            Nodename=$Nodename
        }
        $errordisks+=$cobject
    }
    
    $errordisks|ft

    Das Skript erstellt ein Array namens $errordisks, das die Informationen zu defekten Disks enthält. Es durchläuft alle physischen Disks, die einen vom Status „OK“ abweichenden OperationalStatus haben. Für jede gefundene Disk wird der zugehörige Clusterknotenname ermittelt und ein benutzerdefiniertes PowerShell-Objekt mit den relevanten Informationen erstellt. Schließlich wird das Array $errordisks ausgegeben, und die Informationen werden im Format einer Tabelle angezeigt.

    Beispiel: Anzeige einer defekten SSD in einem Storage Space Direct Cluster

    Mit einer kleinen Änderung des Scripts lassen sich alle Disks, unabhängig von ihrem Status, in einen Storage Space Direkt Cluster, zugeordnet zu dem jeweiligen Clusternode, anzeigen.

    $S2Ddisks=@()
    
    foreach($ed in Get-PhysicalDisk)
    {
    $Nodename=($ed|Get-StorageScaleUnit).friendlyname
    
     if($nodename)
     { 
     
      $cobject = [PSCustomObject]@{
                        FriendlyName = $ed.FriendlyName
                        SerialNumber = $ed.SerialNumber
                        MediaType=$ed.MediaType
                        OperationalStatus=$ed.OperationalStatus
                        Size=$ed.Size/1GB
                        HealthStatus=$ed.HealthStatus
                        Nodename=$Nodename
                        }
    
    
      $S2Ddisks+=$cobject
      }
    
    }
    
    $S2Ddisks|Sort-Object  Nodename,FriendlyName|ft
    Anzeigen aller Disks in einem Storage Space Direct Cluster, mit dem Clusterknoten in dem die Disk verbaut ist.
  • Ändern der Zeitzone / Timezone bei Windows Servern

    Wenn man bei Windows Servern nachträglich die Zeitzone ändern möchte, kommt man auf dem offensichtlichen Weg nicht weiter.

    Wenn man als Administrator in der Systemsteuerung / Control Panel über Change Timezone die Zeitzone ändern möchte kommt eine Fehlermeldung „Unable to Continue“.

    Die Lösung des Problems ist relativ einfach.

    Man öffnet als Administrator eine Powershell und ruft das Systemsteuerungselement Datum und Zeit / Date and Time direkt über die Admin-Powershell auf. Dazu gibt man auf der Shell „timedate.cpl“ ein.

    Jetzt lässt sich die Zeitzone problemlos über „Change Timezone“ ändern.

  • Anzeigeprobleme bei SharePoint-Listen nach dem Juli Patchday 07/2021 – SharePoint 2019 Listen werden nicht mehr angezeigt.

    Nach dem July Patchday 2021 gab es bei SharePoint das Problem, dass Listen in der Listenasicht nicht mehr dargestellt wurden. Es wurde nur eine leere weiße Seite angezeigt. In der Quellcodeansicht sah man aber, dass der Server doch Content ausliefert, der aber nicht gerendert wird.

    Nach einigem Suchen und Testen konnte die „Modern View / Moderne Erfahrung von SharePoint 2019 als Fehlerursache ausgemacht werden. Wenn man bei einer Liste die „Moderne Erfahrung“ deaktiviert, wird die Seite wieder richtig gerendert.

    Die „Moderne Ansicht/ Moderne Erfahrung / modern experiences / modern View“ lässt sich per Powershell auch auf Websitesammlungsebene deaktivieren.

    Add-PSSnapin microsoft.sharepoint.powershell -ea 0
    $site = Get-SPSite http://siteurl
    
    #Disable modern Lists and libraries for Site Collection
    $featureguid = new-object System.Guid "E3540C7D-6BEA-403C-A224-1A12EAFEE4C4"
    $site.Features.Add($featureguid, $true)

    Quelle: https://tishenko.com/set-classic-view-as-default-on-sharepoint-2019-sites/

    PowerShell Script um in allen Sitecollections einer SharePoint Farm die „Modern Experience“ zu deaktivieren.

    Add-PSSnapin microsoft.sharepoint.powershell -ea 0
    $sitecols= get-spsite -Limit all
    foreach($sitecol in $sitecols)
    {
    $featureguid = new-object System.Guid "E3540C7D-6BEA-403C-A224-1A12EAFEE4C4"
    $sitecol.Features.Add($featureguid, $true)
    }

  • SharePoint Fehler: „Problem beim Anwenden der Webvorlage: Für diese Webvorlage müssen bestimmte Features installiert und aktiviert sein.“

    Nach einem Versions-Update einer SharePoint Umgebung treten beim Erstellen einer SharePoint Webseite mit einem Websitetemplate ein Fehler auf: „Problem beim Anwenden der Webvorlage: Für diese Webvorlage müssen bestimmte Features installiert und aktiviert sein.“

    Featurebeschreibung: MobileExcelWebAccess Feature
    Feature-ID: E995E28B-9BA8-4668-9933-CF5C146D7A9F

    Das fehlende Feature kann per PowerShell mit folgenden Befehl aktiviert werden:

    Enable-SPFeature -Identity E995E28B-9BA8-4668-9933-CF5C146D7A9F -Url "http://sharepoint.local/sitecollection"

    Nach der Aktivierung des fehlenden Features lässt sich das Websitetemplate wieder wie vorher als Grundlage für eine neue SharePoint-Website verwenden.

  • Bei Office 365 das Ablaufen der Benutzer-Passwörter deaktivieren (Set up office 365 user passwords to never expire)

    Als Standardeinstellung werden bei Office 365 Accounts die Passwörter nach 90 Tagen ungültig bzw. laufen aus und müssen neu gesetzt werden. Wenn man diese Zeit als zu kurz ansieht oder den Zwang, die Passwörter neu zu setzen ganz abschalten will, muss man die Windows PowerShell zu Hilfe nehmen.

    Um sich mit der Powershell mit seinem Cloud ActiveDirectory zu verbinden, braucht man zwei Voraussetzungen:

    1. „MS Online Sign In Assistant“ Download
    2. Install the Powershell Azure AD Module Download

    Sind beide Voraussetzungen installiert, gibt man folgende Befehle in der Powershell Eingabeaufforderung ein:

    Import-Module MSOnline

    #Hier gibt man seine Administrator-Zugangsdaten ein, mit dem man Office 365 administriert
    $msolcred = get-credential

    #Verbindungsaufbau zum Active Directory seines Office 365 Accounts
    connect-msolservice -credential $msolcred

    #Zu bearbeitendes Userobjekt ermitteln
    $user=Get-MsolUser -UserPrincipalName „user@domain.tld

    # Setzen der PasswordNeverExpires Eigenschaft aus True
    $user | Set-MsolUser -PasswordNeverExpires $true

    Um die Einstellungen zu kontrollieren, kann man sich alle Eigenschaften des Benutzerobjekts anzeigen lassen:

    Get-MsolUser -UserPrincipalName User@Domain.tld | fl

    Weitere Infos

  • Zusätzliche E-Mail-Adressen zu Office 365 Exchange Online-Kontakten hinzufügen

    In der Office 365 Web-Administration kann man für Exchange Online-Kontaktobjekte nur eine E-Mail-Adresse konfigurieren. Möchte man zusätzliche E-Mail-Adressen angeben, muss man dies über die Powershell erledigen.

    Weitere E-Mail-Adressen für Kontaktobjekte können nützlich sein, um beliebige Weiterleitungen von E-Mail-Adressen an externe Adressen zu konfigurieren. E-Mails an alle weiteren E-Mail-Adressen von Kontaktobjekten werden an die primäre E-Mail-Adresse des Kontaktobjekts weitergeleitet.

    Vorgehensweise:

    Set-ExecutionPolicy RemoteSigned

    #Hier Benutzername und Passwort des administrativen Office 365 Accounts eingeben
    $UserCredential = Get-Credential 

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

    Import-PSSession $Session

    #Optionales Hinzufügen eines neuen Kontaktobjekts

    $myContact=New-MailContact -Name „Max Mustermann“ -DisplayName „Max Mustermann“ -ExternalEmailAddress „max@mustermann.de“

    #Alternativermitteln eines bestehenden Kontaktobjektes

    $myContact =Get-MailContact -Identity “ Max Mustermann „

    #Hinzufügen der zusätzlichen E-Mail-Adressen zu dem Kontaktobjekt

    $myContact |Set-MailContact -EmailAddresses „SMTP:mail@test.de“

    #Kontrolle, welche zusätzlichen E-Mail-Adressen einem Kontakt zugewiesen wurden

    Get-MailContact -Identity „Max Mustermann“|select -ExpandProperty EmailAddresses

    #Trennen der Remote-Powershellverbindung

    Remove-PSSession $Session

    Weitere Informationen: Adding multiple Email addresses to mail contacts in Office 365

  • Darstellen der Ordnerstruktur einer SharePoint-Dokumentenbibliothek mithilfe einer Treeview

    Die Aufgabenstellung war, ein Formularcenter mithilfe von SharePoint zu erstellen. Es sollten über 400 Formulare hierarchisch gegliedert zum Download angeboten werden. Nach längerem Testen der standardmäßigen Gruppierungfunktionalitäten für Sharepoint-Listen, was nicht das gewünschte Ergebnis brachte, stieß ich auf folgenden englischen Blogeintrag: Adding a Treeview to a Document Library using SPTreeView and SPHierarchicalDataSource

    Hier wurde gezeigt, wie man mittels SharePoint-Designer eine Ansicht erstellen kann, die die Ordnerstruktur einer SharePoint-Dokumentenbibliothek mittels eines TreeView-Steuerelementes abbildet – und dies ganz ohne Hilfe eines Webparts.

    Folgende Schritte sind für eine TreeView-Ansicht einer SharePoint-Dokumentenbibliothek notwendig:
    1. Aktivieren der Dateiansicht im SharePoint-Designer, um „Alle Dateien“ anzuzeigen. Dies muss unter den Website-Einstellungen der entsprechenden Websitesammlung gemacht werden. Hier ist unter der Rubrik „Websitesammlungsverwaltung“ der Link „SharePoint Designer-Einstellungen“ auszuwählen. Danach muss die Checkbox „Verwaltung der URL-Struktur der Website aktivieren“ aktiv gesetzt werden.

    SharePoint_Designer_Einstellungen

    SharePoint_Designer_Alle_Dateien_anzeigen

    2.  Danach ist die entsprechende View, die mit dem TreeView-Steuerelement versehen werden soll, im SharePoint-Designer im erweiterten Modus zu bearbeiten.

    SharePoint_Designer_Datei_im_erweiterten_Modus_bearbeiten

    3. Danach wird der komplette Inhalt des ContentPlaceHolder-Tags mit der ID „PlaceHolderMain“ ausgeschnitten und über die Zwischenablage in einem externen Editor temporär abgelegt.

    <asp:Content ContentPlaceHolderId="PlaceHolderMain" runat="server">
    
    <-- Gesamten Taginhalt ausschneiden und zwischenspeichern -->
    
    </asp:Content>

    4. Erstellen einer HTML-Tabelle in dem leeren ContentPlaceHolder-Tag, um das Treeview-Steuerelement und die ursprüngliche Liste der Dokumentenbibliothek zu platzieren.

    <asp:Content ContentPlaceHolderId="PlaceHolderMain" runat="server">
    
    <-- Tabelle als Layouthilfe für die Treeviev und die Liste der Dokumentenbibliothek -->
    <table style="width: 100%">
     <tr valign="top">
         <td width="20%">
         <-- Spalte für die Treeview -->
         </td>
         <td>
         <-- Spalte für die Listendarstellung der Dokumentenbibliothek -->
         </td>
    
        </tr>
    </table>
    </asp:Content>

    5. Ermitteln der notwendigen Informationen für das Treeview-Steuerelement mithilfe der Powershell und dem SharePoint-Designer. Benötigt werden die ListID der Dokumentenbibliothek und die ID der Webseite, in der sich die Dokumentenbibliothek befindet.

    Die ListID der Dokumentenbibliothek wird mit dem SharePoint-Designer ermittelt:

    ListID_von_SharePoint_Liste_mit_SharePoint_Designer_ermitteln

    Die ID der Website kann mit der PowerShell ermittelt werden:

    PS C:\scripts> $site=get-spsite http://xxxxxxxxx/formularcenter
    PS C:\scripts> $site.id
    Guid
    ----
    e2044234-0449-4362-af2b-7ba48b9ad678

    6. Vorbereiten und Anpassen des Codes für das Treeview-Steuerelement:

    <SharePoint:SPHierarchyDataSourceControl id="doclibDataSource" runat="server" RootListId="XXXXXXXXXXXXXXX" RootWebId="YYYYYYYYYYYYY" ShowFolderChildren="true" EnableViewState="false"></SharePoint:SPHierarchyDataSourceControl>
    <SharePoint:SPTreeView ID="doclibtreeview" runat="server" DataSourceID="doclibDataSource" EnableViewState="false" ExpandDepth="2"  SelectedNodeStyle-CssClass="ms-tvselected"></SharePoint:SPTreeView>
    
    <-- XXXXXXXXXXXXXX = ID der Dokumentenbibliothek, ermittelt mit dem SharePoint Designer -->
    <-- YYYYYYYYYYYYYY = ID der Website, ermittelt mit der Powershell -->

    7. Einfügen des Treeview-Codes in die oben erstellte Tabelle.

    8. Einfügen des zwischengespeicherten Codes für die eigentliche Listendarstellung der Dokumentenbibliothek, ebenfalls in die oben erstellte Tabelle.

    9. Das Ganze sollte nun wie folgt aussehen:

    SharePoint_Dokumentenbibliothek_mit_Treeview