2025-04-09

Windows File Share - Cannot access shared folder

Windows File Share - Cannot access shared folder
Windows File Share - Can't access shared folder
Windows File Share - Making a reliable file share


Issue

Trying to map a drive to another computer in the home network fails with a "Cannot access shared folder", or you are prompted for a user-id/password that should work, but doesn't.  

For years, I've had troubles making a reliable Windows share connection with the computers in my local network.  It seems to sometimes work, sometimes not.  More typically, it would start to work after an initial failure.  These steps make for a more reliable network.

For this discussion, assume two computers:  A desktop and a laptop (any two computers)

Prerequisites:

  • Both computers must have password-enabled Windows accounts (logins)
  • The remote computer must be powered-on, but does not have to be logged in to a user-account.  The remote computer can be on a screen saver (but not asleep).  The remote computer can have all users "logged-out."
  • Both computers must be on the same physical network (home network)
  • Both computers (should be) in the same Windows Workgroup (untested for this article; assumed they are in the same Workgroup), and it is helpful if both have a friendly name.
Windows Workgroup:

A.  Open Windows Settings (the Gear icon), [System] tab

B.  In "Domain or Workgroup" link,

Consider renaming each PC to a friendly name. 
Some PC's come from the factory with a name like "W3b29411a" -- feel free to change.  The name should be relatively short, no spaces.

In the same panel, make the two machine's Workgroup name the same. 
In this example, "Wolfhouse"

Click for larger view


Network and Internet

Microsoft is confused in this area.  The settings that need to be changed are scattered in various control panels, and where these settings are is incoherent.

I am unhappy with the steps in this section because some of the settings can only be run while logged in as an administrator -- and there does not seem to be a way to promote a non-administrative account with enough rights to do this.  This means temporarily making that user an administrator, make the change, and return them to normal rights.

1.  In Windows Settings (the Gear icon) 

In [Network & Internet] (left-nav)
In center list, choose "Ethernet"
Confirm both computers are marked (*) Private Network



2.  On each computer, while logged in as an Administrative account:

Note: Try these steps and if you succeed, your account is an administrator-level account (which it should not be; see end of this article for a thought on this.)  Only Administrators can see these menus.  There is not  a way to promote a non-admin user, giving enough rights to run this step.  If you attempt, but see  "Ask and administrator to change..." -- your account does not have rights.  See directly below.

In Settings (the gear icon)
Select left-nav "Network and Internet"
Scroll down and select "Advanced Network Settings" from the center list
Select "Advanced Sharing Settings"

In Private Networks:
[x] Turn on "Network Discovery"
[x] Turn on "Set up network connected devices automatically"
[x] Turn on "File and Printer Sharing"

Leave Public Networks turned off

In "All Networks", many articles recommend turning off 'Password Protected Sharing'.  I do not recommend this.  

2a.  Alternately: *If* your local account does not have administrator rights, log that user out of the windows desktop, and login as the Administrator account to make the changes, or run these two commands from  an elevated command prompt:

From the Non-Admin account, Start, Run, "CMD" (run-as Administrator)
From the DOS command Prompt, type these commands, all on one line:

netsh advfirewall firewall set rule group="Network Discovery" new enable=Yes
- Look for "updated 62 rule(s)"

netsha advfirewall firewall set rule group="File and Printer Sharing" new enable=Yes
- Look for "updated 46 rule(s)"



Services:

3.  On each workstation in the network (regardless of the user logged into that workstation):

- Click the Start Button and immediately begin typing the work "Services"
- When offered, select "Services" (Services.msc) - choose "Run as Administrator"

3a.  In the list of services, locate these six services:

"Function Discovery Provider Host"  (illustrated)
"Function Discovery Resource Publication" (illustrated)
Network Connected Devices Auto-Setup
Network List Service
"SSDP Discovery"
"UPnP Device Host"



3b.  For each service, change the Startup Type from (Manual) to "Automatic (Delayed Start)"


Why are these services not set to auto-start when Sharing is turned on?  No clue.  Some of these auto-start *after* a first network share attempt; some do not.  By having these services always running at machine-boot, network sharing becomes reliable. 


Building the Share:

Microsoft calls common folders a "Share" -- where one computer can open a folder on another and can write and update files.  

In this example, the desktop computer is named "Oscar" and the laptop is named "MaryLeno".   The desktop is trying to reach the laptop's drive.  Assume a folder on a laptop's C: drive, named "C:\Data" 

The goal:  Make this folder 'openable' from the desktop with these steps.

On the Laptop

A.  Using File Explorer, locate the "C:\Data" folder (any folder).  

Highlight the folder on the "detail side"


It is helpful if this folder is 'higher-up' in the directory tree, saving from having to build lots of shares for lower folders.  Permissions are set at this level and flow down, through all subfolders.  Typically, "Everyone" (full-control) rights are granted. 

If a folder needs to be "ReadOnly", with different rights than another Share, it needs to have its own Share Name and cannot live within an upper-share.  This may force building a whole series of other shares, or it may force you to move the ReadOnly Share to another location on the hard disk.

Be leery about sharing the entire "C:\Users\<you>\Documents" (myDocuments) folder.  You might consider making a sub-folder, such as "...\Documents\Public".  "Documents" is more sensitive, with more secret stuff, than would be found in a normal data folder.


B. On the highlighted folder, right-click, 

Choose "Properties"
Click "Share"


C.  In the text box, type "Everyone" (Add)

When prompted, choose "ReadWrite"

"Everyone" does not mean everyone in the world. This is limited to your network.  Full Control (see illustration below) seems to be a requirement to update files.  Peer-to-Peer network sharing in Windows has always been a little wonky.

D.  On OK, you are prompted:  "Your folder is shared"; Click "Done"  (you are not really done...)

Although the Share is built, Windows picked the sharename, based on the folder name and if the folder name had spaces, it will cause troubles later. 

There can be as many "named shares" on a computer as desired.  You can share USB drives, D: drives, CD drives, or individual folders.  I typically name my shares "data".  It could be called "myData", "theSharedDrive", "TaxFiles",  etc..

Continue with the next step!


E.  Review or Change the Share name:

From the Properties panel (near the Share button)
Click "Advanced Sharing"

- Note the [x] checkbox:  Share this folder

- Review the Share name; if necessary, change to a shorter name

- For example, if the folder name was "Some Random Folder" -- the sharename would be the same.  Consider renaming the share to "mySharedFolder"

Click "Permissions"
Select "Everyone" -- confirm "Full Control"
Close all dialogs


Using the Share:

Windows Sharing is screwy.  If the destination Share's user-account is a local administrator's account, the share from, say, the desktop to the laptop will work, as shown next.  Type the computer's name, backslash, and the share's name, along with the administrator's credentials, and you will be logged in.  

If the remote computer's account is a non-admin account (a "loser account" -- highly recommended), or the account was formerly an administrator, but is now demoted to a standard account, the share will not work with that user-ID, even if that non-administrative account built the share!

*In other words, the remote computer can only be mapped with the Administrator's login-credentials!

On the plus side, the remote computer does not need to be logged in with either the Administrator or the original share.  The only thing needed is the machine be turned on -- and not asleep.  Just login with the admin's credentials.

The Share's name is the computer's name + the share name:  
\\MaryLeno\Data

where "\\" indicates a server name -- the laptop's name is "\\MaryLeno"
(or from other thoughts:  \\MaryLeno\Public)

If a similar share was built on the desktop computer, it could have been called:
\\Oscar\Data    or
\\Oscar\myRandomFolder

In this example, the share was made on the Laptop. 
From the Desktop, access that drive (that Share) by:

a.  From the desktop, launch File Explorer

b.  On File Explorer's top address line (the path area), type

"\\MaryLeno\Data"  (no quotes, where "data" is the Laptop's Share name, as defined above)

c.  You may be prompted for credentials.

Use the login name from the remote computer's point-of-view -- the user's name on the remote computer.
and the same password that user uses to unlock the PC when it first boots

To find which user name to use:  On the Laptop, Start, Run, "CMD" (a DOS prompt).  Note the path name.  (There are other ways of finding this name, such as typing "whoami")


To find the computer's name:
From File Explorer's left-nav, "This PC", Right click, "Properties"
or at the CMD / DOS Prompt, type "Whoami", seeing the computer name:  Oscar\trayw


Possible Problems:

The (remote) computer does not appear in File Explorer's "Network"

Possible solutions: 
- A share was not built
- The "Network Discovery" settings were not set (step 2, above)


Possible Problem:

The login credentials do not work -- but they should.  You know the user-id and password is right and you know that UserID has an actual login (and profile) on that workstation.

Solution 1:  It appears you must use an Administrator's credentials to login to the Share.

Possible Problem:

I don't want to give away my admin credentials.
Does not seem much hope here;  you could create a new account, such as "ShareUser" -- but it would have to be admin in order to present the share.

2025-03-09

Password Generator

Password Generator - program for building lists of random passwords.  Length and complexity are controlled by options.  Final results are written to an ASCII file.

This is a free Keyliner download that is a stand-alone executable.  No installation or configuration is required.  This program does not require registration, nor are there ads or nagware. Free to use for personal and commercial use.  Tested on Windows 7 through 11. 



For a company's public wireless access, we needed a way to generate passwords with a one-week life-span, starting Monday morning through the next Sunday night.  



This program generates several year's worth of weekly passwords, writing results to a tab-delimited file. 




When run, it writes a simple tab-delimited text file, editable with Notepad or Excel.  In the three columns are that week's password, the starting date and an ending date.  If you only need passwords, check the option [x] Passwords Only, or simply ignore the dates.

Installation:

There is none.  Download, expand the ZIP, and run.
No spying, no adware, no registration, no logins, no kidding.

This is self-contained .exe that does not need installation, registry changes, or configuration files.  Place the .exe, and its related files, in any directory.  Double-click to run.

Since keyliner cannot afford a signing certificate, you will be prompted the file is not safe (being downloaded from the internet).  Click "more information" and allow the program to run or see below for better instructions.


Follow these steps for a more professional installation:

This program should be copied to ProgramFiles so it gains the protection of other Windows security features. Total time: about a minute.

A.  Download the .ZIP to a Download or Temp folder:

From Keyliner's public GDrive, click this link and download to a local temp or download directory.  Do not download directly into ProgramFiles

Download ZIP link
Public GDrive Download Link:  PasswordGenerator.zip

Direct link: https://drive.google.com/file/d/1P7vx-Zy8cgBeBMH2fOBhVn-OcrCH5BME/view?usp=drive_link

MD5:  c7-47-fc-51-ac-6b-65-c5-31-2f-e1-db-cf-95-af-0e
SHA256: 324fdede08e6b645e09f58d84e2185ee79fc33184d859ce665596dbcaf13cabe

When downloading, different browsers behave differently.
You may be prompted the file cannot be scanned.  Click "Download anyway"

B.  Mark the ZIP as safe-to-run:

(This step may not be needed if downloaded by Edge and you clicked "More / Download Anyway")

Using File Explorer, right-mouse-click the downloaded .zip
Select "Properties"
Check [x] Unblock.  This removes the "mark of the web." 

                 Click for larger view

* Only do this if you trust keyliner *and* only if downloaded from keyliner's public GDrive.  When unblocking the .zip, it also unblocks each file within the zip -- an important thought.

If "Unblock" is not visible, it has already been unlocked (by Microsoft Edge).
Once [x] Unblocked is clicked, this security menu disappears.


C.  Create a Program folder to hold the program:

Using File Explorer, open folder C:\Program Files,
Create a folder  C:\Program Files\Util


D.  Separately, Copy the .exe and two other support files to ProgramFiles\Util:

Using File Explorer,
Double-click to open the downloaded .ZIP

Copy and paste these three files from the download folder 
to C:\Program Files\Util

PasswordGenerator.exe 
PasswordGenerator.dll 
PasswordGenerator.runtimeconfig.json 
 
 
Do this copy as a two-step, copying from the download folder into Program Files.  Windows security will not let you download directly into Program Files (technically, you will not be able to remove the "mark of the web" if downloaded directly into Program Files).


E.  Create a Start Menu icon:

Using File Explorer, in C:\Program Files\Util
Right-mouse-click "PasswordGenerator.exe" and "Pin to Start"
 
The program is ready to run.  See icon on Start Menu.


Use:

1.  Launch the program.




2.  Choose a password strength.

     Default = "High" 
     (12-character passphrase, Caps, digits, likely multi-word, depending on length)

     For documentation:
  Lowest  = 8 Char,  Capitals, No numbers
  Low     = 8 Char,  Capitals, Numbers
  Med     = 10 Char, Capitals, Numbers 
  High    = 12 Char, Capitals, Numbers, likely multi-word
  Higher  = 14 Char, Capitals, Numbers, multi-word
  Highest = 16 Char, Capitals, Numbers, multi-word

     Optionally select "[x] Require special characters"      

3.  Set the Count for how many passwords to generate.
     100 is two year's worth of weekly passwords.

4.  Type an output file path and filename or accept the default:
     "C:\Temp\VisitorPassword.csv"

5.  Pick a Start Date (any Date) or ignore if not important.
     Set the Cycle Date; which defaults to a 7-day password rotation.

6.  Click Generate.

7.  Click the Notepad icon to view the resulting file.  Example results:


The generated list has passwords and dates.
To generate the file without the dates, choose [x] Password Only, no dates


Randomization Notes:

The intent is to generate multiple, random passwords (passphrases), but over the course of several hundred runs, it may assemble the same phrase.  This is okay.  Theoretically, you are assigning the phrase to different users or across wide time spans.

To help block dictionary attacks, at strengths "Higher" and above, the program generates multi-word phrases. 

Password lengths are guaranteed to be the minimum length indicated, but are often longer, with variations in lengths.  For example, a "High" password will be a minimum of 12 characters, but will randomly generate longer, 12 to (16) characters.  This makes passwords less predictable.

When generating single passwords, press ctrl-C to copy the password to the clipboard.


Drop me a note on how you used the program.  I welcome suggestions.

Humor:  Earlier versions of this program generated these passwords:  "FriskyHamster27".  Management called.  Program modified.  I am still fond of FriskyHamster.

2025.03 Updates:
Recompiled using .dotNet 8.0 libraries
Added several hundred-word randomizations
Added "password only" option
Added clipboard capabilities
Added Set Sunday/Monday start dates

-----------------------
For an interesting discussion on passwords and for the reasons for this program's design, see this keyliner article:  Link:  "Better Safer and Stronger Passwords"


Download link
Public GDrive Download Link:  PasswordGenerator.zip

Related articles:
keyliner link:  Better Safer and Stronger Passwords
keyliner link:  Calculate MD5 Checksums





2025-02-02

PaintShop Pro - Using a masking layer to change colors

 PaintShop Pro - Using a masking layer to change colors.  For this example, change a person's eye color.


Goal:
Change an eye-color using PSP's Mask feature.
In the photograph, anything's color can be changed with this technique.  For example, a bridge or a river
.

This can be better than PSP's "Color Changing Tool".  Instead of "repainting", this adjusts the hue and saturation, without losing details in the object

I found an AI-generated instructional video on YouTube documenting these steps but the video was unusable.  Here are the steps in a more digestible format.  AI-generated person's Eye-model pilfered from that video.

Using PaintShop Pro 2023
These steps should work with any version and these rough steps will probably work in any photo editor.

Steps:

1.  In the layers pallet, duplicate the background layer
 
Right-mouse-click the layer, select "Duplicate"
Right-click the new layer's name, changing its name to something like "myMaskedLayer"

2.  Highlight the new (duplicated) layer

In the Layers pallet, along the bottom row of icons, click the Mask icon
Choose "Show All"

A new group forms
Note the new White Mask sublayer

3. Add an "HSL" Adjustment Layer

In the new Mask Group, select the inner full-color photograph (illustrated below, in Blue)
(For now, ignore the white Mask layer)

On the bottom, click the Layer's "Adjustment Layer" icon (bottom of pallet)
Select menu "Hue/Saturation/Lightness" (HSL)

4.  An HSL popup appears

A new gray-scale image displays
Check [x] Colorize

Note:  All sliders move to zero
Click OK

5.  Select the White Mask Layer


In the Color Pallet's menu:
- Set the Fore-Color to Black (click the black/white diagonal button)
- Set the Back-Color to White

6.  Paint the eyes

While still on the "White" layer

Select the PaintBrush tool
Set Hardness = 0
Opacity = 100
Size = (Any comfortable, but smaller brush size)

7.  On the gray-scale "white" layer, paint the eyes with a relatively small brush. 

- Use the mouse's roller-wheel to zoom
- Zoom in 1000% is common

You are essentially painting the eyes with a black brush, but since this is on the colorized masked layer; the background color bleeds through


When done, note the white-layer's eyes, showing as two dark eyes on a snowy-white background:

8.  Invert the layer

While still highlighting the "white" layer
Select top-menu:  Layers, "Invert/Mask Adjustment"

The photo returns to normal colors
(The "white" layer, with its two little eyes is now a "black" layer with two white eyes (not illustrated))

9.  Select the HSL layer

Right-click, "Properties"
Adjust the slider-bars until happy with new eye colors

At the group's level, toggle the layer's "Visibility" icon off/and on to see the effect:

10.  Optional: Adjust the effect's lightness

While highlighting the HSL Layer
Select the Pallet's bottom button "New Adjustment Layer"
Choose "Curves" from the sub-menu (not illustrated)

Slide ("scootch") the two sliders inland a "smidge"

Final results:

-end

2025-01-31

Powershell - ParseExact with 3 argument(s): String was not recognized as a valid DateTime

Powershell Code - ParseExact Date Conversion - String not recognized as valid DateTime


Windows Powershell

Goal:  Read and validate a string-date (with a known and expected format). 
Guarding against February 31st and stuff like that

Technique:
Cast the string into a [datetime].
Use ParseExact to convert the date
Use try-catch to detect detect failures.

Code:

[DateTime]$dtconvertedDate           #Declare DateTime Variable
[string]$strmyDate = "01/01/2025"    #Variable to test

try
{
   # Cast the ParseExact as [dateTime]

   # Unsafe
   $dtconvertedDate = [datetime]::ParseExact($strmyDate, "MM/dd/yyyy", $null)

   # Safer
   $dtconvertedDate = [datetime]::ParseExact($strmyDate.Trim(), "M/d/yyyy", $null)
}
catch
{
   # not illustrated -- not a date
}

Possible errors:
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."

Possible answers:
-  $strmyDate  is from an Excel-exported CSV or tab file.   Be sure to .Trim().  Unsafe otherwise.

-  Mask  "MM/dd/yyyy" is case-sensitive!

-  Mask "MM/dd/yyyy"  can be, but is not always safe. 
    Date strings with leading zeros vs not:  "1/17/2025" -- MM/dd will fail.
    Use "M/d/yyyy"

-  Mask in wrong format:  MM-dd-yyyy  vs MM/dd/yyyy
    hyphens vs slash.  ParseExact with a mask cares.