Pages

28 Nov 2018

Visual Studio Code: Black screen issue. Fix

If you are like me and you had an annoying issue with Visual Studio code that caused a black scree then you will like this fix.

My old fix:
code --disable-gpu

This was launching VS Code without GPU acceleration. It was a workable solution, but still very inconvenient.

New, permanent fix:
- Open your Nvidia Control panel
- Set Physx Configuration
- Under Select a physX processor select "CPU":




26 Jul 2018

Migrate MS Flow and PowerApps to a different Office 365 tenant. SharePoint Data Sources

Have you ever tried moving PowerApps or MS Flow from one Office 365 tenant to another? If you have SharePoint as a data source - then the only official way is to remove all such data sources and add them back. This PowerShell script will help you to automatically convert exported App packages to be compatible with the new tenant. This way you won't have to recreate SharePoint data sources.

Here is the script that will help you with this ordeal: https://github.com/Zerg00s/FlowPowerAppsMigrator




19 Jul 2018

Can PowerApps and MS Flow run with elevated privileges?

No, MS Flow and PowerApps are using current user's account.

Setup #1:
- User "Admin" creates a PowerApp that uses SharePoint List as a datasource
- User "Reader" gets Edit access to this app via Sharing, but this user has no permissions to the SharePoint list whatsoever.

What will happen?

Results:
- The "Reader" can open the PowerApp, but as soon as they try to create a new list item - they get an error:
There was a problem saving your change. The data source may be invalid.



Conclusion:
PowerApps use current user's permissions and don't have "run with elevated privileges" functionality.


Setup #2
- User "Admin" creates a PowerApp that uses SharePoint List as a data source
- User "Admin" creates a PowerApp button that runs an MS Flow that creates a list item in the SharePoint List
- User "Reader" gets Edit access to this app via Sharing, but this user has no permissions to the

Results:
- The "Reader" can open the PowerApp, but when they click on the button to run the flow that attempts to create a list item - nothing happens. In the MS flow history we see the 403 (Access denied) error:

System.UnauthorizedAccessException



Conclusion:
MS Flow that are run manually via a button in PowerApps use current user's permissions and don't have "run with elevated privileges" functionality.

P.S. MS Flows that are triggered on List Item Created / Updated are run using the credentials provided by the Flow author. So, depending on how the Flow was started - different credentials are used.




18 Jul 2018

SharePoint 2016 Restore User that was deleted from User Information List

There could be a scenario when the user was deleted both in AD and the User Information List and we need to restore it. That could be necessary when there was a custom solution developed that relies on the user accounts to exist in SharePoint. Needless to say these solutions were developed incorrectly, but who am I to judge.

For these rare cases, here is the way that to restore the deleted user. This worked for me in SharePoint 2016, but it might also work in 2013 and 2019.

Disclaimer: Any direct modifications to the SharePoint SQL databases are not supported by Microsoft. Restore the user by following approach only if you know for sure what you are doing.

1. First of all - determine an ID of the deleted user:


2. In SQL Management Studio - find your content database and navigate to the UserInfo table. Verify that deleted user is still listed in the table. Notice that tp_Deleted will equal to the user ID and tp_IsActive will be equal to 0:


3. Modify a row where tp_id is equal to the user's ID:
 a) set tp_Deleted to 0
 b) set tp_IsActive to True
 c) Save changes to the row


4. For the appropriate content database, run the following command to find deleted user in the  AllUserData table:
  
  SELECT * FROM [WSS_Content].[dbo].[AllUserData] 
  Where bit3 = 1 and tp_ID = User_ID

Make sure this command returned a single row. If there was a single row - proceed to restoring the user:

5. To restore the user, we need to change bit3 column's value from 1 to 0 :
 
 
 UPDATE [WSS_Content].[dbo].[AllUserData] 
 SET bit3 = 0 
 Where bit3 = 1 and tp_ID = User_ID


Done! Now go ahead and click on the deleted user. Verify that there is no error.

27 Jun 2018

Maintenance Mode in SharePoint Online and Modern pages

Turns out, if you append ?maintenancemode=true of your SharePoint page you will see a special maintenance view:



On your page, you will see a summary of data from the Manifest and Data tabs. The summary information includes:
Alias
The name of the web part
Id
The unique ID of the web part
Instance Id
The ID of a specific instance of a web part (that is, if you have two more of the same web parts on a page, they will each have the same web part ID, but a different instance ID.
IsInternal
Indicates whether the web part was made by Microsoft or a third party. If True, it is made by Microsoft. If False, it is made by a third party.
Version
The version number of the web part.
Environment
Environment: Indicates the SharePoint environment in use.
  • 0 = Test environment
  • 1 = Local Workbench
  • 2 = SharePoint
  • 3 = Classic SharePoint
UserAgent
A string that contains information about the device and software in use (such as browser type and version).


Microsoft article "Open and use the web part maintenance page"

SharePoint Online Performance. Easy Way to Capture Metrics

I've stumbled across an interesting Chrome Extension Page Diagnostics for SharePoint Chrome extension. It shows some useful info on the page performance.


Microsoft Article "Use the Page Diagnostics tool for SharePoint Online"



In my case SPRequestDuration and SPIISLatency were not displayed, but you can get these values by simply pressing F12 and typing g_iisLatency and/or g_duration in the console:
g_iisLatency - Shows network latency between the client browser and the IIS server
g_duration - Shows the time it took the page to be returned to the client browser



Update:
I've found out that g_iisLatency and g_duration only show up in the classic pages.




23 Jun 2018

Creating Forms for SharePoint Online using PowerApps, AngularJs, React or Nintex

Here my short presentation on the best options of creating forms in office 365, SharePoint Online

Disclaimer. I've made a couple of mistakes:
1. There is no mobile app for Microsoft Forms. But it MS Forms links open fine in any mobile browser. I guess there is no point in having the app in the first place.
2. The last app I've demonstrated was written using React+TypeScript, not AngularJs.

22 Jun 2018

Determine if SharePoint has enough memory allocated to the distributed cache service

After reading half a dozen articles explaining how to eyeball and calculate the distributed cache size I was wondering: Why no one suggests just to check the current consumption before changing anything? Here is a scary thought: What if we have a ton of memory and we don't need to add any more? I know, this sounds revolutionary.

This is a quick script that I've slapped together to show 1) maximum allocated memory for  the Distributed cache. 2) current usage for all AppFabric caches on the current server.

So, before bumping the Distributed cache, test the current consumption with the script below.


###### DETERMINE IF YOU HAVE ENOUGH MEMORY ALLOCATED TO DISTRIBUTED CACHE:
Add-PSSnapin Microsoft.SharePoint.Powershell
Use-CacheCluster
$hostname = hostname
$configuration = Get-AFCacheHostConfiguration -ComputerName $hostname -CachePort "22233"
Write-host Maximum Size: $($configuration.size)MB HostName: $($configuration.HostName) -ForegroundColor Blue
# Get-AFCache | % {Get-AFCacheConfiguration -CacheName $_.CacheName}
$caches = Get-AFCache | % {Get-AFCacheConfiguration -CacheName $_.CacheName}

 foreach($cache in $caches){
  $stats = Get-AFCacheStatistics $cache.CacheName
  Write-host $cache.CacheName -ForegroundColor Green Cache.
  Write-host Usage: $($stats.Size / 1MB) MB
  Write-host
 }

###### DETERMINE IF YOU HAVE ENOUGH MEMORY ALLOCATED TO DISTRIBUTED CACHE END

Here is the sample result: