<!--  As an open source project with a dedicated but small maintainer team, it can sometimes take a long time for issues to be addressed so please be patient and we will get back to you as soon as we can.
-->

### Preflight Checklist
<!-- Please ensure you've completed the following steps by replacing [ ] with [x]-->

* [x] I have read the [Contributing Guidelines](https://github.com/electron/electron/blob/master/CONTRIBUTING.md) for this project.
* [x] I agree to follow the [Code of Conduct](https://github.com/electron/electron/blob/master/CODE_OF_CONDUCT.md) that this project adheres to.
* [x] I have searched the issue tracker for an issue that matches the one I want to file, without success.

### Issue Details

* **Electron Version:**
  * v5.0.6
* **Operating System:**
  * Windows 10 (1803)
* **Last Known Working Electron version:**
  * Not sure

### Expected Behavior
response should be faster and "access is denied" should only popup once.

### Actual Behavior
"access is denied" message popup and UI kind of partially hang. cursor style not changed while UI dom element style change properly like hover event.

### To Reproduce
make sure you haven't grant privilege of "C:\\ProgramData\\Microsoft\\Search\\Data
```
app.on('ready', () => {
  console.log(new Date());
shell.showItemInFolder("C:\\ProgramData\\Microsoft\\Search\\Data\\Applications\\Windows\\Windows.edb");
console.log(new Date())
});
```

result:
`2020-01-02T07:37:25.277Z`
`2020-01-02T07:37:45.404Z`

takes 10+ second to continue working and two "access is denied" popup.

### Additional Information
the implementation of showItemInFolder is [here line 290](https://github.com/electron/electron/blob/d3622f9c37e8cd94e47206bb6211346011d5f76b/shell/common/platform_util_win.cc) 


code:
```
hr = SHOpenFolderAndSelectItems(dir_item, base::size(highlight), highlight,
                                  NULL);
  if (FAILED(hr)) {
    // On some systems, the above call mysteriously fails with "file not
    // found" even though the file is there.  In these cases, ShellExecute()
    // seems to work as a fallback (although it won't select the file).
    if (hr == ERROR_FILE_NOT_FOUND) {
      ShellExecute(NULL, L"open", dir.value().c_str(), NULL, NULL, SW_SHOW);
    } else {
      LOG(WARNING) << " " << __func__ << "(): Can't open full_path = \""
                   << full_path.value() << "\""
                   << " hr = " << logging::SystemErrorCodeToString(hr);
      ui::win::OpenFolderViaShell(dir);
    }
  }
```
there's a fallback call OpenFolderViaShell, I think this is the root cause.
better to deal with "access denied" error type and btw I guess there might be other error we don't expect a fallback patch?
shell/common/platform_util_win.cc
const OpenExternalOptions& options,
                  OpenCallback callback) {
  base::PostTaskAndReplyWithResult(
      base::CreateCOMSTATaskRunner({base::ThreadPool(), base::MayBlock(),
                                    base::TaskPriority::USER_BLOCKING})
          .get(),
      FROM_HERE, base::BindOnce(&OpenExternalOnWorkerThread, url, options),
      std::move(callback));
}
bool MoveItemToTrash(const base::FilePath& path, bool delete_on_fail) {
  base::win::ScopedCOMInitializer com_initializer;
  if (!com_initializer.Succeeded())
    return false;
  Microsoft::WRL::ComPtr<IFileOperation> pfo;
  if (FAILED(::CoCreateInstance(CLSID_FileOperation, nullptr, CLSCTX_ALL,
                                IID_PPV_ARGS(&pfo))))
    return false;
  
  
  if (base::win::GetVersion() >= base::win::Version::WIN8) {
    
    
    if (FAILED(pfo->SetOperationFlags(