Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何使用Powershell更改“我的电脑桌面”图标?_Windows_Powershell_Shell_Icons_Desktop - Fatal编程技术网

Windows 如何使用Powershell更改“我的电脑桌面”图标?

Windows 如何使用Powershell更改“我的电脑桌面”图标?,windows,powershell,shell,icons,desktop,Windows,Powershell,Shell,Icons,Desktop,我正在尝试学习一点Shell脚本,因为测试自动化现在似乎越来越流行 我对Powershell的理解相当笼统。我当前的目标是更改我的电脑桌面图标 # Changes the My Computer desktop icon name from "This PC" to "VSDC0365". Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser $My_Computer

我正在尝试学习一点Shell脚本,因为测试自动化现在似乎越来越流行

我对Powershell的理解相当笼统。我当前的目标是更改我的电脑桌面图标

# Changes the My Computer desktop icon name from "This PC" to "VSDC0365".

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

$My_Computer = 17

$Shell = New-Object -COMObject Shell.Application

$NSComputer = $Shell.Namespace($My_Computer)

$NSComputer.Self.Name = $Env:COMPUTERNAME
在使用Powershell时,我还没有接触到Microsoft Windows 10操作系统的某些方面。我希望也许比我多产的作家能帮助我实现这个目标

我刚刚测试了两个代码片段,它们在第一次尝试时意外地成功运行

第一个可以称为
Create\u Shortcut.PS1
,它为可以运行批处理文件的命令行预处理系统创建一个桌面图标

# Creates the command-line desktop icon.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

$TargetFile = "C:\Windows\System32\Cmd.Exe"

$ShortcutFile = "\\ISXPFV01.hd00.example.com\us_qv2_dem_user_data_pool_nra$\EE65037.HD00\Desktop\Command-Line.Lnk"

$WScriptShell = New-Object -COMObject WScript.Shell

$Shortcut = $WScriptShell.CreateShortcut($ShortcutFile)

$Shortcut.TargetPath = $TargetFile

$Shortcut.Save()
第二个可能被称为
Rename\u My\u Computer.PS1
,它重命名我的电脑桌面图标

# Changes the My Computer desktop icon name from "This PC" to "VSDC0365".

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

$My_Computer = 17

$Shell = New-Object -COMObject Shell.Application

$NSComputer = $Shell.Namespace($My_Computer)

$NSComputer.Self.Name = $Env:COMPUTERNAME
我感兴趣的东西对于比我更有经验的人来说可能非常简单。我需要通过指定路径来更改“我的电脑桌面”图标

由于我还没有达到这一目标,我们非常感谢在这个问题上提供的任何帮助

谢谢你的阅读

在@Theo的精彩评论后更新:

一个新的令人惊讶的工作片段,它成功地生成了“我的电脑桌面”图标:

# HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel\
# {20D04FE0-3AEA-1069-A2D8-08002B30309D}
# 0 = show
# 1 = hide

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

$Path = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel"

$Name = "{20D04FE0-3AEA-1069-A2D8-08002B30309D}"

$Exist = "Get-ItemProperty -Path $Path -Name $Name"

if ($Exist)
{
    Set-ItemProperty -Path $Path -Name $Name -Value 0
}
Else
{
    New-ItemProperty -Path $Path -Name $Name -Value 0
}
现在,我所要做的就是在设置了他在评论中提到的设置之后,通过编程方式按F5刷新桌面视图

与刷新相关的另一个更新:

另一个令人惊讶的工作片段,刷新桌面视图:

# Refresh Desktop Ability

$Definition = @'

    [System.Runtime.InteropServices.DllImport("Shell32.dll")]

    private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);

    public static void Refresh() {
        SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
    }
'@

Add-Type -MemberDefinition $Definition -Namespace WinAPI -Name Explorer

# Refresh desktop icons
[WinAPI.Explorer]::Refresh()
现在剩下的一切就是在刷新之前以某种方式更改我的电脑桌面图标

与取得该注册表项所有权相关的更新:

棘手的事情。我不知道事情会变得这么复杂

当前,它失败,错误消息以以下消息开头:

PS Y:\> Y:\Digitization\Powershell\The_My_Computer_Desktop_Icon\Change_Registry_Key.PS1
True
Exception calling "OpenSubKey" with "3" argument(s): "Requested registry access is not allowed."
At Y:\Digitization\Powershell\The_My_Computer_Desktop_Icon\Change_Registry_Key.PS1:139 char:1
+ $RegKey = [Microsoft.Win32.Registry]::ClassesRoot.OpenSubKey(         ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : SecurityException
这是
更改注册表项.PS1
文件的内容:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Function Enable-Privilege {
  Param(
  ## The privilege to adjust.
  [ValidateSet(
      "SeAssignPrimaryTokenPrivilege"
    , "SeAuditPrivilege"
    , "SeBackupPrivilege"
    , "SeChangeNotifyPrivilege"
    , "SeCreateGlobalPrivilege"
    , "SeCreatePagefilePrivilege"
    , "SeCreatePermanentPrivilege"
    , "SeCreateSymbolicLinkPrivilege"
    , "SeCreateTokenPrivilege"
    , "SeDebugPrivilege"
    , "SeEnableDelegationPrivilege"
    , "SeImpersonatePrivilege"
    , "SeIncreaseBasePriorityPrivilege"
    , "SeIncreaseQuotaPrivilege"
    , "SeIncreaseWorkingSetPrivilege"
    , "SeLoadDriverPrivilege"
    , "SeLockMemoryPrivilege"
    , "SeMachineAccountPrivilege"
    , "SeManageVolumePrivilege"
    , "SeProfileSingleProcessPrivilege"
    , "SeRelabelPrivilege"
    , "SeRemoteShutdownPrivilege"
    , "SeRestorePrivilege"
    , "SeSecurityPrivilege"
    , "SeShutdownPrivilege"
    , "SeSyncAgentPrivilege"
    , "SeSystemEnvironmentPrivilege"
    , "SeSystemProfilePrivilege"
    , "SeSystemtimePrivilege"
    , "SeTakeOwnershipPrivilege"
    , "SeTcbPrivilege"
    , "SeTimeZonePrivilege"
    , "SeTrustedCredManAccessPrivilege"
    , "SeUndockPrivilege"
    , "SeUnsolicitedInputPrivilege")]
    $Privilege
    ## The process on which to adjust the privilege. Defaults to the current process.
  , $ProcessId = $Pid
    ## Switch to disable the privilege, rather than enable it.
  , [Switch] $Disable
  )

  $Definition = @'
    using System;
    using System.Runtime.InteropServices;

    public class AdjPriv
    {
       [DllImport(  "advapi32.dll"
                  , ExactSpelling = true
                  , SetLastError = true)]

       internal static extern bool AdjustTokenPrivileges(  IntPtr htok
                                                         , bool disall
                                                         , ref TokPriv1Luid newst
                                                         , int len
                                                         , IntPtr prev
                                                         , IntPtr relen);

       [DllImport(  "advapi32.dll"
                  , ExactSpelling = true
                  , SetLastError = true)]

       internal static extern bool OpenProcessToken(  IntPtr h
                                                    , int acc
                                                    , ref IntPtr phtok);

       [DllImport(  "advapi32.dll"
                  , SetLastError = true)]

       internal static extern bool LookupPrivilegeValue(  string host
                                                        , string name
                                                        , ref long pluid);

       [StructLayout(  LayoutKind.Sequential
                     , Pack = 1)]

       internal struct TokPriv1Luid
       {
          public int Count;
          public long Luid;
          public int Attr;
       }

       internal const int SE_PRIVILEGE_ENABLED    = 0x00000002;
       internal const int SE_PRIVILEGE_DISABLED   = 0x00000000;
       internal const int TOKEN_QUERY             = 0x00000008;
       internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;

       public static bool EnablePrivilege(  long processHandle
                                          , string privilege
                                          , bool disable)
       {
           bool retVal;
           TokPriv1Luid tp;
           IntPtr hproc = new IntPtr(processHandle);
           IntPtr htok = IntPtr.Zero;
           retVal = OpenProcessToken(  hproc
                                     , TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
                                     , ref htok);
           tp.Count = 1;
           tp.Luid = 0;
           if(disable)
           {
               tp.Attr = SE_PRIVILEGE_DISABLED;
           }
           else
           {
               tp.Attr = SE_PRIVILEGE_ENABLED;
           }
           retVal = LookupPrivilegeValue(  null
                                         , privilege
                                         , ref tp.Luid);
           retVal = AdjustTokenPrivileges(  htok
                                          , false
                                          , ref tp
                                          , 0
                                          , IntPtr.Zero
                                          , IntPtr.Zero);
           return retVal;
    }
  }
'@

$ProcessHandle = (Get-Process -Id $ProcessId).Handle
$Type = Add-Type $Definition -PassThru
$Type[0]::EnablePrivilege($processHandle, $Privilege, $Disable)
}

Enable-Privilege SeTakeOwnershipPrivilege

# Change Owner to the local Administrators group.
$RegKey = [Microsoft.Win32.Registry]::ClassesRoot.OpenSubKey(               `
            "CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}"                  `
          , [Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree  `
          , [System.Security.AccessControl.RegistryRights]::TakeOwnership)
$RegACL = $RegKey.GetAccessControl()
$RegACL.SetOwner([System.Security.Principal.NTAccount]"Administrators")
$RegKey.SetAccessControl($RegACL)

# Change Permissions for the local Administrators group.
$RegKey = [Microsoft.Win32.Registry]::ClassesRoot.OpenSubKey(               `
            "CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}"                  `
          , [Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree  `
          , [System.Security.AccessControl.RegistryRights]::ChangePermissions)
$RegACL = $RegKey.GetAccessControl()
$RegRule = New-Object System.Security.AccessControl.RegistryAccessRule(     `
             "Administrators"                                               `
           , "FullControl"                                                  `
           , "ContainerInherit"                                             `
           , "None"                                                         `
           , "Allow")
$RegACL.SetAccessRule($RegRule)
$RegKey.SetAccessControl($RegACL)
与获取该注册表项所有权的另一次尝试相关的更新:

这是另一个代码段的内容,称为
Change\u Registry\u Key.2.PS1

#Define HKCR
New-PSDrive -Name       HKCR7              `
            -PSProvider Registry           `
            -Root       HKEY_CLASSES_ROOT

#Set $Path HKCR Key Path
$Path = "HKCR:\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}"

#Set $Path Permissions
$ACL = Get-ACL $Path

$Rule = New-Object System.Security.AccessControl.RegistryAccessRule ( `
            "<domain>\<username>"                                     `
          , "FullControl"                                             `
          , "Allow")

$ACL.SetAccessRule($Rule)

$ACL | Set-ACL -Path $path

#Set HKCR 'Attributes' Key Value
Set-ItemProperty -Path   $Path        `
                 -Name   Attributes   `
                 -Value  b0940064
关于@Theo第二版重命名我的电脑桌面图标的更新:

这个版本还不适合我

它的测试非常简单:

  • 我正在手动将我的电脑桌面图标重命名为
    fififi
  • 然后我运行这个片段
  • 然后手动刷新桌面视图
虽然我希望我的电脑桌面图标重新命名为
工作笔记本
,但它的名称仍然固定为
fififi

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

#Requires -RunAsAdministrator

Function Enable-Privilege {
    [CmdletBinding(  ConfirmImpact         = 'low'
                   , SupportsShouldProcess = $false)]
    [OutputType('System.Boolean')]
    Param(
        [Parameter(  Mandatory = $true
                   , Position  = 0)]
        [ValidateSet(  "SeAssignPrimaryTokenPrivilege"
                     , "SeAuditPrivilege"
                     , "SeBackupPrivilege"
                     , "SeChangeNotifyPrivilege"
                     , "SeCreateGlobalPrivilege"
                     , "SeCreatePagefilePrivilege"
                     , "SeCreatePermanentPrivilege"
                     , "SeCreateSymbolicLinkPrivilege"
                     , "SeCreateTokenPrivilege"
                     , "SeDebugPrivilege"
                     , "SeEnableDelegationPrivilege"
                     , "SeImpersonatePrivilege"
                     , "SeIncreaseBasePriorityPrivilege"
                     , "SeIncreaseQuotaPrivilege"
                     , "SeIncreaseWorkingSetPrivilege"
                     , "SeLoadDriverPrivilege"
                     , "SeLockMemoryPrivilege"
                     , "SeMachineAccountPrivilege"
                     , "SeManageVolumePrivilege"
                     , "SeProfileSingleProcessPrivilege"
                     , "SeRelabelPrivilege"
                     , "SeRemoteShutdownPrivilege"
                     , "SeRestorePrivilege"
                     , "SeSecurityPrivilege"
                     , "SeShutdownPrivilege"
                     , "SeSyncAgentPrivilege"
                     , "SeSystemEnvironmentPrivilege"
                     , "SeSystemProfilePrivilege"
                     , "SeSystemtimePrivilege"
                     , "SeTakeOwnershipPrivilege"
                     , "SeTcbPrivilege"
                     , "SeTimeZonePrivilege"
                     , "SeTrustedCredManAccessPrivilege"
                     , "SeUndockPrivilege"
                     , "SeUnsolicitedInputPrivilege")]
        [String]$Privilege

      , [Parameter(Position = 1)]
        $ProcessId = $PID

      , [switch]$Disable
        )


        Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;

public class Privilege {
    [DllImport(  "advapi32.dll"
               , ExactSpelling = true
               , SetLastError  = true)]

    internal static extern bool AdjustTokenPrivileges(
         IntPtr htok
       , bool   disall
       , ref    TokPriv1Luid newst
       , int    len
       , IntPtr prev
       , IntPtr relen);

    [DllImport(  "advapi32.dll"
               , ExactSpelling = true
               , SetLastError  = true)]

    internal static extern bool OpenProcessToken(  IntPtr h
                                                 , int    acc
                                                 , ref    IntPtr phtok);

    [DllImport(  "advapi32.dll"
               , SetLastError = true)]

    internal static extern bool LookupPrivilegeValue(  string host
                                                     , string name
                                                     , ref    long pluid);

    [StructLayout(  LayoutKind.Sequential
                  , Pack = 1)]

    internal struct TokPriv1Luid {
        public int  Count;
        public long Luid;
        public int  Attr;
    }

    internal const int SE_PRIVILEGE_ENABLED    = 0x00000002;
    internal const int SE_PRIVILEGE_DISABLED   = 0x00000000;
    internal const int TOKEN_QUERY             = 0x00000008;
    internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;

    public static bool EnablePrivilege(  long   processHandle
                                       , string privilege
                                       , bool   disable) {
        bool         retVal;
        TokPriv1Luid tp;
        IntPtr       hproc = new IntPtr(processHandle);
        IntPtr       htok  = IntPtr.Zero;
        retVal = OpenProcessToken(  hproc
                                  , TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
                                  , ref htok);
        tp.Count = 1;
        tp.Luid  = 0;
        if(disable) {
            tp.Attr = SE_PRIVILEGE_DISABLED;
        }
        else {
            tp.Attr = SE_PRIVILEGE_ENABLED;
        }
        retVal = LookupPrivilegeValue(  null
                                      , privilege
                                      , ref tp.Luid);
        retVal = AdjustTokenPrivileges(  htok
                                       , false
                                       , ref tp
                                       , 0
                                       , IntPtr.Zero
                                       , IntPtr.Zero);
        return retVal;
    }
}
'@

    try {
        $proc   = Get-Process -Id $ProcessId -ErrorAction Stop
        $name   = $proc.ProcessName
        $handle = $proc.Handle
        $action = if ($Disable) { 'Disabling' } else { 'Enabling' }
        Write-Verbose (  "{0} privilege '{1}' for process {2}" -f $action `
                       , $Privilege                                       `
                       , $name)
        [Privilege]::EnablePrivilege(  $handle         `
                                     , $Privilege      `
                                     , [bool]$Disable)
    }
    catch {
        throw
    }
}

################################################################
# Step 1: Give the current process the SeTakeOwnershipPrivilege.
################################################################

    $null = Enable-Privilege -Privilege SeTakeOwnershipPrivilege -Verbose

##############################################################
# Step 2: change Owner to the local Administrators group
##############################################################

# Better not use the string "Administrators", because this
# might have a different name in other cultures.
#
# $RegACL.SetOwner([System.Security.Principal.NTAccount]"Administrators")
#
# Use the Well-Known SID instead.
# Local Administrators Group.
$Administrators = `
   [System.Security.Principal.SecurityIdentifier]::new('S-1-5-32-544')

$RegKey = [Microsoft.Win32.Registry]::ClassesRoot.OpenSubKey(        `
     "CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}"                  `
   , [Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree  `
   , [System.Security.AccessControl.RegistryRights]::TakeOwnership)

$RegACL = $RegKey.GetAccessControl()
$RegACL.SetOwner($Administrators)
$RegKey.SetAccessControl($RegACL)

##############################################################
# Step 3:  Give the Local Administrators Group Full Control.
##############################################################

# Refresh the A.C.L.
$RegACL = $RegKey.GetAccessControl()

# Test if there is a Deny rule in the ACL
# for Administrators and, if so, remove that rule.
$RegACL.GetAccessRules(                                     `
         $true                                              `
       , $true                                              `
       , [System.Security.Principal.SecurityIdentifier]) |  `
    Where-Object {                                          `
             $_.AccessControlType -eq 'Deny'                `
        -and $_.IdentityReference -eq $Administrators.Value `
    } |                                                     `
    ForEach-Object { $null = $RegAcl.RemoveAccessRule($_) }

# Create a new rule allowing the Administrators Full Control.
$RegRule = [System.Security.AccessControl.RegistryAccessRule]::new( `
             $Administrators                                        `
           , 'FullControl'                                          `
           , 'ContainerInherit'                                     `
           , 'None'                                                 `
           , 'Allow')
$RegACL.SetAccessRule($RegRule)
$RegKey.SetAccessControl($RegACL)

# Close the Registry Key.
$RegKey.Close()


##############################################################
# Step 4: Change the 'LocalizedString' property
# in the registry to suit your needs.
##############################################################
#
# With PowerShell 5, you need to use
# `Registry::HKEY_CLASSES_ROOT\..` syntax in order to be able
# to set the registry Type for the value
# with parameter '-Type'.
# As of PowerShell 7, the '-Type' parameter is included.

$RegPath = `
 'Registry::HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}'
Set-ItemProperty -Path  $RegPath          `
                 -Name  'LocalizedString' `
                 -Value "%ComputerName%"  `
                 -Type  ExpandString      `
                 -Force
我在控制台中得到的是以下文本:

PS C:\WINDOWS\system32> C:\Users\MihaiDobrescu\OneDrive\Documents\2_Facturi\12_-_Bank_Services\Digitization\Powershell\Change_Registry_Key.3.PS1 -RunAsAdministrator
VERBOSE: Enabling privilege 'SeTakeOwnershipPrivilege' for process powershell_ise

PS C:\WINDOWS\system32>
更新:一个最终版本,里面有美丽的汤的所有成分

再次感谢@Theo,他实际调试了整个混乱局面

注意:这个片段甚至在虚拟机内部也能令人惊讶地工作,因为它不需要以管理员身份运行,因为解决这个问题不需要对整个太阳系拥有所有权

# How to test:
#
# 1. Rename the My Computer Desktop Icon to "Fifi".
# 2. Remove the My Computer Desktop Icon from the Desktop View.
# 3. Run this snippet.
# 4. Observe how the My Computer Desktop Icon is produced on the Desktop View,
#    with the name "Tele-Ordinator" and with a very emotional Desktop Icon.

# Allow the execution of snippets.

Set-ExecutionPolicy               `
    -ExecutionPolicy RemoteSigned `
    -Scope           CurrentUser

# Produce the My Computer Desktop Icon on the Desktop View.

# HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel\
# {20D04FE0-3AEA-1069-A2D8-08002B30309D}
# 0 = show
# 1 = hide

$Path = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel"

$Name = "{20D04FE0-3AEA-1069-A2D8-08002B30309D}"

$Exist = "Get-ItemProperty -Path $Path -Name $Name"

if ($Exist)
{
    Set-ItemProperty     `
        -Path  $Path     `
        -Name  $Name     `
        -Value 0
}
Else
{
    New-ItemProperty     `
        -Path  $Path     `
        -Name  $Name     `
        -Value 0
}

# Rename the My Computer Desktop Icon from "This PC" to "Tele-Ordinator".

$My_Computer = 17

$Shell = New-Object -COMObject Shell.Application

$NSComputer = $Shell.Namespace($My_Computer)

$NSComputer.Self.Name = "Tele-Ordinator"

# Change the My Computer Desktop Icon.

$RegPath =                                                                                                                                    `
    'Registry::HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\DefaultIcon'

if (!(Test-Path -Path $RegPath))
{
    $null = New-Item             `
                -Path   $RegPath `
                -Force
}

Set-ItemProperty                                                               `
    -Path  $RegPath                                                            `
    -Name  '(Default)'                                                         `
    -Value 'Y:\Digitization\Icons\Robsonbillponte-Happy-Holidays-Pictures.ICO' `
    -Type  ExpandString                                                        `
    -Force

# Refresh the Desktop View.

$Definition = @'

    [System.Runtime.InteropServices.DllImport("Shell32.dll")]

    private static extern int SHChangeNotify(
          int    eventId
        , int    flags
        , IntPtr item1
        , IntPtr item2);

    public static void Refresh()
    {
        SHChangeNotify(
          0x8000000
        , 0x1000
        , IntPtr.Zero
        , IntPtr.Zero);
    }
'@

Add-Type                          `
    -MemberDefinition $Definition `
    -Namespace        WinAPI      `
    -Name             Explorer

[WinAPI.Explorer]::Refresh()
另一个最终更新用于设置和运行批处理文件,该批处理文件使用Microsoft Windows批处理文件预处理系统自动执行上述自动化操作:

这只是一个名为
Change\u Desktop\u Icons.BAT
的短片段

ChDir %SystemRoot%\System32\WindowsPowerShell\v1.0\

%SystemRoot%\System32\WindowsPowerShell\v1.0\PowerShell.Exe Y:\Digitization\PowerShell\The_My_Computer_Desktop_Icon\Change_Desktop_Icon.PS1

Pause
这是这个东西的输出,双击它自己的桌面图标

'\\ISXPFV01.hd00.example.com\us_qv2_dem_user_data_pool_nra$\EE65037.HD00\Desktop'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported.  Defaulting to Windows directory.

C:\Windows>ChDir C:\WINDOWS\System32\WindowsPowerShell\v1.0\

C:\Windows\System32\WindowsPowerShell\v1.0>C:\WINDOWS\System32\WindowsPowerShell\v1.0\PowerShell.Exe Y:\Digitization\PowerShell\The_My_Computer_Desktop_Icon\Change_Desktop_Icon.PS1

C:\Windows\System32\WindowsPowerShell\v1.0>Pause
Press any key to continue . . .

如评论所述,更改“计算机”图标标题相当麻烦

下面的代码适用于使用PowerShell 5.1的Windows 10 Pro

您需要以管理员身份运行此程序

在所有这些之后,桌面上还没有显示计算机名。您需要在桌面上按F5,或使用找到的代码刷新桌面


要更改图标本身,需要更改registrypath中的默认值

HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\DefaultIcon 
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\DefaultIcon
用于将来的新登录,或registrypath

HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\DefaultIcon 
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\DefaultIcon
对于当前用户

默认情况下,它指向
%SystemRoot%\System32\imageres.dll,-109
,这意味着它从imageres.dll中提取图标编号109。 在那个dll中。共有343个图标,因此您可以选择使用同一资源中的另一个图标,或从另一个现有dll中选择一个图标。(例如,您可以使用from nirsoft)

我还没有对此进行测试,但也可以让它指向您自己的图标的完整路径和文件名,如
%SystemDrive%\MyComputerIcon.ico

例如,这将更新图标以使用imageres.dll图标编号149

$regPath = 'Registry::HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\DefaultIcon'
Set-ItemProperty -Path $regPath -Name '(Default)' -Value '%SystemRoot%\System32\imageres.dll,-149' -Type ExpandString -Force
看起来像这样


您需要将
HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}
注册表项设置为类似于
%UserName%on%ComputerName%”的
属性。但是,只有首先获得该密钥的所有权,才能这样做。请记住,这个属性属于
ExpandString
(又称
REG\u EXPAND\u SZ
)你能看一看,@Theo,我在问题正文中附加的最新片段,告诉我它是否至少接近你在评论中写的内容吗?我不确定你是否意识到,但是
HKEY\U CLASSES\U ROOT
实际上不是一个合适的注册表根键。它实际上是一个映射键,包含来自其他根键的信息的串联。您需要的是其他根键之一,
HKEY\u LOCAL\u MACHINE\SOFTWARE\Classes
。因此,您可能会发现,用
HKEY_LOCAL_MACHINE\SOFTWARE\CLASSES\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}
替换
HKEY_CLASSES\u ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}
,如果不是更多的话,也是有成效的。对此我深表歉意