You are right, it only worked once:
MSDN for SetSystemCursor wrote:
The system destroys hcur by calling the DestroyCursor function. Therefore, hcur cannot be a cursor loaded using the LoadCursor function. To specify a cursor loaded from a resource, copy the cursor using the CopyCursor function, then pass the copy to SetSystemCursor.
I updated the last script, to make first a copy of the cursor and let that be destroyed. Also, we need enough room for the copy, but I don't know for sure, how much. I assume 32*32 words, 32*32*4 = 4096 bytes, plus change. (For some reason CopyCursor did not work, so I used CopyImage, as Shimanov.)