Powershell: Using hashtables or arrays to pass parameters to cmdlets

Was tun wenn man in einem PS-Script ein cmdlet aufrufen muss, diesem cmdlet aber eine variable Zahl an Parametern übergeben möchte?

Man könnte das machen:

if (varParam1)
{
    cmdlet -param "fix param" -param1 varParam1
}
else
{
    cmdlet -param "fix param"
}

oder man verwendet „splatting“. Dabei werden die Parameter mit Hashtables oder Arrays übergeben. Hier ein Beispiel mit Hashtable:
ACHTUNG!!! GANZ WICHTIG!!
Beachtet bei der Verwendung der Hashtable-Variable das @-Zeichen!!!

$Colors = @{ForegroundColor = "black"; BackgroundColor = "white"}
#Write a message with the colors in $Colors
Write-Host "This is a test." @Colors

Und wieder was gelernt 😉

Source:

Sharepoint 2016: use custom js files without problems due to MDS

Ich habe mir für das „Branding“ unserer Sharepoint-Sites eine Kopie der Seatlle-Masterpage erstellt. Die einzige Änderung dieser Kopie gegenüber dem Original ist diue Einbindung von eigenen JS und CSS Files.

Diese Einbindung sieht so aus. In der Masterpage ganz oben beim Tag „Sharepoint:AjaxDelta“

    <asp:ContentPlaceHolder id="PlaceHolderBodyAreaClass" Visible="true" runat="server" />
  </SharePoint:AjaxDelta>
  
        <!-- Referencing jQuery and custom js-files -->
    <!-- Pleas see at the end of the <body>-Tag!! -->
    <SharePoint:ScriptLink language="javascript" name="~sitecollection/SiteAssets/SKB-SP2016/jquery-3.2.1.min.js" 
      LoadAfterUI="true" OnDemand="false" runat="server" Localizable="false" />
    <SharePoint:ScriptLink language="javascript" name="~sitecollection/SiteAssets/SKB-SP2016/skb-sp2016.js" 
      LoadAfterUI="true" OnDemand="false" runat="server" Localizable="false" />

        <!-- Referencing custom css-files -->
        <!--<SharePoint:CssRegistration Name="<%$SPUrl:~sitecollection/Style Library/SKB-SP2016/SKB-SP2016.css%>" After="Themable/corev15.css" runat="server"/>-->
  
  <SharePoint:CssRegistration Name="Themable/corev15.css" runat="server" />
</head>
<body>

Ganz unten (vor dem Ende des Body-Tags) kommt dann noch das:

<SharePoint:ScriptBlock runat="server">
if (typeof asyncDeltaManager != "undefined") {
    asyncDeltaManager.add_endRequest($_global_myNameSpace_sp2016_async_js);
}
$_global_myNameSpace_sp2016_other_js();
</SharePoint:ScriptBlock>


</body>
</SharePoint:SPHtmlTag>

Wozu der Block unten in der Masterpage?

Die Javascript Function „$_global_my_sp2016_other_js“ wird ausgeführt, wenn die Site „neu“ geladen wird. Also wenn man das erste Mal dort ist oder wenn man z.B. „Strg“+“F5“ drückt. Aber auch wenn Sharepoint merkt, dass sich etwas an den benötigten Dateien geändert hat. Der springende Punkt ist: Nicht immer!!

Was hingegen bei „jedem Klick“ aufgerufen wird ist die Javascriptfunction „$_global_my_sp2016_async_js“. Diese wird auch ausgeführt, wenn die MDS aktiv ist und eigentlich nur differenzen zwischen der aktuellen Seite und der aufgerufenen Seite übertragen werden!

Nur der Vollständigkeit halber hier noch das JS File:

// reference jQuery
var $jq = jQuery.noConflict();

// declare namespace
/* This line would also do it: Function.registerNamespace('myNameSpace.sp2016');  */
window.myNameSpace = window.myNameSpace || {};
window.myNameSpace.sp2016 = window.myNameSpace.sp2016 || {};

// is not called on every klick because of MDS, ...
function $_global_myNameSpace_sp2016_js_init() {
    
    .....

};

// is called on every klick (MDS oder not!!)
function $_global_myNameSpace_sp2016_async_js() {
    
    // Remember: This code is executed for every klick! So don't forget to check
    //           if something is allready applied!!
 
    ...
    
};

_global_myNameSpace_sp2016_js_init

Kurzer Hinweis am Ende: Ich verwende eigene Scripte die diese Masterpage gemeinsam mit den restlichen Dateien für jede Website einer SiteCollection (bzw. genauer: für jede Website in allen Sitecollections einer WebApp) hochladen und als Theme aktivieren.

Die Sourcen dazu findet ihr in diesem Beitrag.

Sharepoint: custom javascript use singleton pattern to prevent multiple calls!

Bei mir wird in Sharepoint 2016 eine Javascript-Function direkt aus der Masterpage heraus ausgerufen. Durch MDS und andere Dinge wird diese Funktion bei einem „Strg“+“F5“ reload dadurch bis zu 3x aufgerufen. Um das zu verhindern gibt es die Singleton-Pattern. Dis sollte so aussehen:

function MySingletonClass () {

  if (arguments.callee._singletonInstance) {
    return arguments.callee._singletonInstance;
  }

  arguments.callee._singletonInstance = this;

  this.Foo = function () {
    // ...
  };
}

var a = new MySingletonClass();
var b = MySingletonClass();
console.log( a === b ); // prints: true

Da das bei mir so nicht korrekt funktioniert hat (vermutlich habe ich den richtigen Aufruf einfach nicht hinbekommen, habe ich das so abgewandelt:

// My simple "singleton Pattern"
var sp2016InitFirstRun = true;

// This function is called from at the bottom of my masterpage!!
function $_global_sp2016_js_init() {

    // My simple "singleton Pattern"
    if (!sp2016InitFirstRun) 
    {   
        return;   
    }
    else 
    {  
        sp2016InitFirstRun = false;    
    };
    
    // The following code is only run once!!
 
    ...
 
};

$_global_sp2016_js_init()

Funktioniert wie gewünscht: Der Code wird nur 1x gestartet. Egal wie oft Sharepoint die Function aufruft 😉

Quelle: stackexchange.com

Sharepoint 2016: Add custom js and deal with MDS problems!

Wenn man zu einer Sharepoint-Site eigenes CSS und JS hinzufügen möchte gibt es ja bekanntlich viele Möglichkeiten. Ich brauche das um das Layout und die Farben unserer Sahrepoint-Seiten anzupassen. Ich habe mir dazu eine Kopie der „Seattle-Masterpage“ erstellt und dort dann meine CSS und JS Files verlinkt. Das funktionierte alles soweit ganz OK. Mein Problem war allerdings, dass die Minimale Downloadstrategie (kurz „MDS“) hat mir einen Strich durch die JS-Rechnung gemacht! Mein JS-Code wurde nur ausgeführt wenn die Site komplett neu geladen wurde. Ich habe Tonnen von Websites, Blogs und sonstiger Info gelesen aber keine (funktionierende) Lösung gefunden. ERst nach einer Frage an die Stack-Exchange-Community erhielt ich endlich die richtige Antwort:

Des Rätsels Lösung ist der „AsnycDeltaManager“!

Hier ein paar Links die nun, nachdem das nun alles Funktioniert, endlich ein Gesamtbild ergeben. Zuerst kommen die Links, die mich zur Lösung brachten, danach dann die weiteren Links. Alles in allem habe ich zwar viel Zeit versch…en aber auch wieder einiges gelernt 😉

Quellen:

Links die zwar teilweise informativ sind/waren, aber mich nicht wirklich weiter gebracht haben:

Sharepoint: „Save website as template“ not available

Wenn ihr in den Website Einstellungen den Link zu „Website als Vorlage speichern“ nicht findet, dann könnte das daran liegen, dass das Website-Sammlungs-Feature „Sharepoint-Server Veröffentlichungsinfrastruktur“ aktiviert ist!!

Man kann die Website allerdings trotzdem als Voralge speichern! Einfach zu diesem Link navigieren:

http://path.to.site/_layouts/savetmpl.aspx

Links:

Sharepoint: From sitecollection deleted users still appear in _web/api/siteusers

Wie der Titel schon sagt: Wenn man aus einer Sitecollection einen User die Berechtigungen nimmt, dann wird dieser trotzdem noch im API-Aufruf „siteusers“ aufgeführt.

Wenn man in dieser Sitecollection auf die URL

http://path.to.sitecol/_catalogs/users/simple.aspx

geht kann man den gewünschten User aus der Liste löschen. Wirklich praktikabel ist das allerdings nicht. Ich hoffe mal,

  • daß das nicht so oft passiert bzw. auch,
  • daß nach der die Retention-Time diese User auch automatisch aus der Liste verschwinden.

Sollte ich daran denken, werde ich das Ergebnis dieser Frage mal hier posten 😉

Quelle: https://sharepoint.stackexchange.com/questions/116910/deleted-user-still-appearing-in-api-web-siteusers

Sharepoint: grant access to sharepoint management shell

Auf Anraten eines Sharepoint-Profis habe ich mir einen Admin-User angelegt (siehe hier). Damit dieser User aber dann auch Powershell zur Administration verwenden kann muss man diesem User dann auch die Rechte zur Verwendung von Powershell geben:

# This should only return all the users who have the SharePoint_Shell_Access role
Get-SPShellAdmin

# To grant access for one content-database:
Type Add-SPShellAdmin -UserName Domain\Username -Database (Get-SPContentDatabase -Identity “ContentDatabaseName”)

# To grant access to all content databases
Get-SPDatabase | Add-SPShellAdmin DOMAIN\UserName

Source:
https://blogs.technet.microsoft.com/anneste/2014/09/17/how-to-enable-remote-powershell-for-sharepoint-2013-for-non-administrators/

Alle weiteren Infos auch hier: https://technet.microsoft.com/en-us/library/ff607596.aspx

P.S.: Solltet ihr eine Fehlermeldung wie diese erhalten:

Add-SPShellAdmin : Cannot alter the role 'db_owner', because it does not exist or you do not have permission.

dann liegt das darin, dass dem User zuerst noch Datenbankrechte gegeben werden müssen. Infos dazu auch im oben verlinkten Technet Artikel zum Powershell Befehl.

 

Sharepoint: Create and use a separate „admin“ user!

Auf anraten eines Sharepoint-Profis habe ich mir für die „tägliche Arbeite“ am Content von anderen Usern (Unterstützung und Support) einen Admin User angelegt.

Wie? In der „Zentral Administration“ unter „Application Management“ – „Manage Web Applications“. Dort dann jede Web App in der „User Policy“ eine User hinzufügen, der für „All Zones“ die Berechtigung „Full Control“ erhält. Zusätzlich auch die Checkbox „Account operates as system“ setzen!

Diese Einstellung hat den Effekt, dass bei allen Dingen, die mit diesem User dann erledigt werden, nicht der Name des Admin-Users z.B. als „Ersteller“ steht, sondern „Systemaccount“. Wenn man also z.B. für ein größeres Projekt den Import der vorhandenen Files übernimmt (bzw. übernehmen muss), dann steht bei den Files als ERsteller „Systemaccount“ und nicht eurer Admin-Name. Eine gute Möglichkeit sich als Admin ein wenig „im Hintergrund“ zu halten 😉

Sharepoint: Host named site collection

Hier eine kleine Doku zu diesen Host-named site collections! Ich hatte das Problem, dass die URL für das Such-Center nicht funktionierte. Ich fand zwar die SC in einer WebApp aber nirgends ein Binding (IIS) oder eine AAM (SP) dazu.

Erst als ich diesen Link dann las fand ich heraus, dass ich das Binding händisch selbst erstellen muss 😉

https://social.technet.microsoft.com/wiki/contents/articles/28233.sharepoint-2013-host-named-site-collection-hnsc-overview.aspx

Joomla: Async ajax call to component task

Die Daten und Tipps habe ich mir von zahlreichen Websites geholt. Aber die wichtigsten waren diese hier. Vom ersten Link hatte ich den grundlegenden Code. Der zweite Link war auch noch sehr informativ. Zu guter Letzt fehlten mir noch die Hinweise aus dem letzten Link um die Antwort zu bekommen:

Für mich persönlich noch: Wurde beim Tournament-Helper bei der Front-End-Game-Update Website.