Oprettelse af genveje med Windows Script Host

  • WSH og PowerShell giver dig mulighed for at oprette .lnk- og .url-genveje med ikoner, argumenter og arbejdsmapper.
  • SpecialFolders og Shell API'en løser Desktop-, Start- og andre særlige systemstier.
  • PowerShell tilgår COM (.WScript.Shell) og .NET (EventLog) for at automatisere uden at være afhængig af cmdlets.
  • I implementeringer (Intune) skal du sørge for omfanget af variabler og tilladelser, så adgange oprettes korrekt.

Windows Script Host

Hvis du arbejder dagligt i Windows, sparer det dig en masse klik og hovedpine at oprette velkonfigurerede genveje. Med Windows Script Host (WSH) og PowerShell Du kan automatisere oprettelsen af ​​skrivebordsgenveje, genveje til startmenuen eller endda URL'er med brugerdefinerede ikoner, argumenter og arbejdsmapper. I denne artikel kompilerer og omskriver jeg, med en praktisk tilgang, alt hvad du behøver for at opnå dette, baseret på eksempler fra det virkelige liv. VBScript, Visual FoxPro og PowerShell.

For at sætte dette i kontekst dokumenterede Microsoft denne funktion for år tilbage i sin vidensbase (KB 244677), hvori det forklarede, hvordan Generer skrivebordsgenveje med WSH og udvide den tilgængelige objektmodel. Derudover vil vi se, hvordan man kan drage fordel af Nyt-objekt i PowerShell til at håndtere .NET- og COM-objekter (inklusive WSH), og hvordan man omgår nogle begrænsninger for fjern-cmdlet'er med .NET-klasser som f.eks. System.Diagnostics.EventLog.

Hvad er Windows Script Host (WSH), og hvilke systemer kører det på?

Windows Script Host er Microsofts infrastruktur, der giver dig mulighed for at køre scripts VBScript og JScript indbygget i Windows. Den integrerer en objektmodel, der er tilgængelig via COM (for eksempel den berømte WScript.Shell) som du kan bruge til at starte programmer, manipulere filer, læse registreringsdatabasen, åbne dialogbokse og selvfølgelig Opret genveje.

På kompatibilitetsniveau blev WSH integreret direkte i Windows 98, Windows 2000 og senere versioner. For Windows NT 4.0 kunne installeres som en del af Windows NT 4.0 Option Pack. På det tidspunkt centraliserede Microsoft downloads og dokumentation på Windows NT 4.0-webstedet. Scripting, men i dag i moderne Windows har du det allerede tilgængeligt uden ekstra trin.

I praktiske sammenhænge udmærker WSH sig, fordi det reducerer opgaver, der ville være besværlige at udføre manuelt, til et par linjer. Med sine objekter (Shell, Network, FileSystemObject) og særlige mapper veldefineret, kan du automatisere almindelige softwareadministrations- og implementeringshandlinger.

WshShell-nøglemetoder og egenskaber for genveje

Den mest anvendte klasse er WScript.ShellMed den opretter du genvejen og justerer dens egenskaber. Dens praktiske metoder omfatter:

  • Opret genvejgenererer en .lnk (eller .url) i den sti, du angiver.
  • Kør y ExecDe udfører kommandoer og processer, uanset om de forventes at blive fuldført eller ej.
  • AppAktivér y SendNøgler: nyttig til at automatisere vinduer og tastetryk.
  • Pop op y LogHændelse: Vis meddelelser eller skriv til hændelsesloggen.
  • Specialmapperreturnerer specielle mappestier (Skrivebord, Favoritter osv.).
  • Sleep: sætter udførelsen på pause i det angivne tidsrum.

Derudover udviser den egenskaber som f.eks. Aktuel mappe (nuværende mappe), Miljø (miljøvariabler) og samlingen Specialmapper (skrivebeskyttet, med foruddefinerede systemstier). Disse API'er bruges ligeligt fra både VBScript og sprog, der opret COM-objekter (f.eks. PowerShell med New-Object -ComObject).

Oprettelse af genveje med WSH i praksis

Grundideen er enkel: du skaber objektet WScript.Shell, beregner du stien, hvor .lnk'en skal gemmes (normalt brugerens skrivebord eller det offentlige skrivebord) og kalder Opret genvejDerefter konfigurerer du genvejsegenskaber såsom TargetPath, Argumenter, Ikonplacering, Arbejdsmappe og gemmer med Save().

Eksempler i Visual FoxPro (via COM WScript.Shell)

Disse eksempler, som historisk er dokumenteret for Visual FoxPro, demonstrerer, hvor lidt der kræves for at producere en fungerende .lnk-fil med WSH. De bruger alle samlingen Specialmapper('Skrivebord') for at finde den nuværende brugers skrivebord.

Eksempel 1: Grundlæggende genvej

WshShell = CreateObject("Wscript.shell")
strDesktop = WshShell.SpecialFolders("Desktop")
oMyShortcut = WshShell.CreateShortcut(strDesktop + \\ "Sample.lnk")
oMyShortcut.WindowStyle = 3  && 3=Maximizada, 7=Minimizada, 4=Normal
oMyShortcut.IconLocation = "C:\\myicon.ico"
oMyShortcut.TargetPath = "%windir%\\notepad.exe"
oMyShortCut.Hotkey = "ALT+CTRL+F"
oMyShortCut.Save

I denne blok er der fastgjort vinduesstil, ikon, destination og tastaturgenvej, alt sammen på én gang. Bemærk at destinationen understøtter miljøvariabler som %windir%.

Eksempel 2: Tilføjelse af kommandolinjeargumenter

WshShell = CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
oMyShortCut = WshShell.CreateShortcut(strDesktop + \\ "Foxtest.lnk")
oMyShortCut.WindowStyle = 7  && 7=Minimizada, 0=Maximizada, 4=Normal
oMyShortcut.IconLocation = home() + "wizards\\graphics\\builder.ico"
oMyShortCut.TargetPath = "c:\\Program Files\\Microsoft Visual Studio\\VFP98\\vfp6.exe"
oMyShortCut.Arguments = "-c " + """ " + Home() + "config.fpw" + """
oMyShortCut.WorkingDirectory = "c:\\"
oMyShortCut.Save

Udover destinationen tilbringer du her en kæde af argumenter og arbejdsmappen er indstillet. Den viser også, hvordan man korrekt bruger anførselstegn i argumentlinjen.

Eksempel 3: Direkte adgang til en URL

WshShell = CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
oUrlLink = WshShell.CreateShortcut(strDesktop + \\ "Microsoft Web Site.URL")
oUrlLink.TargetPath = "http://www.microsoft.com"
oUrlLink.Save

Hvis du indstiller som Målsti en http(s)-adresse, genererer WSH en .url-fil, som standardbrowseren åbner direkte.

Eksempel i Visual Basic 6: Find særlige mapper og opret .lnk

Oprettelse af genveje med Windows Script Host

En anden klassisk tilgang var at løse særlige mapper med Shell API'en (SHGetSpecialFolderLocation og SHGetPathFromIDList) og derefter kalde CreateObject('WScript.Shell'). Dette mønster er nyttigt, hvis du vil vise valgmuligheder som Skrivebord, Programmer, Favoritter, Start osv. og lade brugeren vælge, hvor genvejen skal gemmes.

' Declaraciones resumidas (VB6)
Private Const CSIDL_DESKTOP = &H0
Private Const CSIDL_PROGRAMS = &H2
Private Const CSIDL_FAVORITES = &H6
Private Const CSIDL_STARTUP = &H7
Private Const CSIDL_RECENT = &H8
Private Const CSIDL_STARTMENU = &HB
Private Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" _
(ByVal hwndOwner As Long, ByVal nFolder As Long, pidl As ITEMIDLIST) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" _
(ByVal pidl As Long, ByVal pszPath As String) As Long

' Uso de WScript.Shell para crear el acceso directo en la ruta elegida
Set obj = CreateObject("WScript.Shell")
Set acceso_directo = obj.CreateShortcut(Combo1 & "\\" & Text1)
With acceso_directo
  .TargetPath = App.Path & "\\" & App.EXEName
  .Save
End With
Set obj = Nothing

Denne prøve kombinerer løsning af særlige ruter Ved at oprette .lnk-filen tilbød den foreslåede brugerflade en liste over forskellige systemstier (Skrivebord, Programmer, Favoritter osv.) og en tekstboks til genvejsnavnet.

PowerShell: Oprettelse af COM-genveje og fejlfinding af en Intune-sag i den virkelige verden

PowerShell giver dig adgang til COM ligesom VBScript, men med moderne syntaks. Den normale måde at gøre dette på er at oprette objektet. WScript.Shell med New-Object og kald CreateShortcut. Det er en simpel fremgangsmåde og kompatibel med alle moderne Windows-operativsystemer.

Opret en .lnk på brugerens skrivebord

$WshShell = New-Object -ComObject WScript.Shell
$lnk = $WshShell.CreateShortcut("$HOME\\Desktop\\PSHome.lnk")
$lnk.TargetPath = $PSHome
$lnk.Save()

Bemærk forskellen mellem enkelte og dobbelte anførselstegn: med dobbelte anførselstegn, PowerShell spørgsmålsvariablerFor eksempel: "$HOME\\Desktop" producerer den fulde sti, mens '$HOME\\Desktop' bevarer den litterale værdi uudvidet.

Brug af New-Object med .NET og COM

# Crear referencias .NET
New-Object -TypeName System.Diagnostics.EventLog
New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

# Crear WSH y otros objetos COM
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

Disse linjer viser, hvordan PowerShell kan fungere med begge dele .NET-klasser (for at overvinde begrænsningerne for nogle cmdlets eksternt) som med COM-objekter (til opgaver som f.eks. oprettelse af genveje).

Virkelighedsscenarie med Intune: Oprettelse af genveje til en skrivebordsmappe

Et almindeligt implementeringsscenarie med Intune er at generere genveje i en bestemt mappe på skrivebordet for hver bruger og eventuelt fastgør den til Hurtig adgang. Nedenfor er et repræsentativt (opsummeret) script med hjælpefunktioner, der registrerer, om processen kører som SYSTEM, og løser de relevante stier til skrivebordet og startmenuen:

[CmdletBinding()]
Param(
  [Parameter(Mandatory=$true)] [String]$ShortcutTargetPath,
  [Parameter(Mandatory=$true)] [String]$ShortcutDisplayName,
  [Parameter(Mandatory=$false)] [Switch]$PinToStart=$false,
  [Parameter(Mandatory=$false)] [String]$IconFile=$null,
  [Parameter(Mandatory=$false)] [String]$ShortcutArguments=$null,
  [Parameter(Mandatory=$false)] [String]$WorkingDirectory=$null
)

function Add-Shortcut {
  param(
    [Parameter(Mandatory)] [String]$ShortcutTargetPath,
    [Parameter(Mandatory)] [String]$DestinationPath,
    [Parameter()] [String]$WorkingDirectory
  )
  $WshShell = New-Object -ComObject WScript.Shell
  $Shortcut = $WshShell.CreateShortcut($DestinationPath)
  $Shortcut.TargetPath = $ShortcutTargetPath
  $Shortcut.Arguments = $ShortcutArguments
  $Shortcut.WorkingDirectory = $WorkingDirectory
  if ($IconFile) { $Shortcut.IconLocation = $IconFile }
  $Shortcut.Save()
  [Runtime.InteropServices.Marshal]::ReleaseComObject($WshShell) | Out-Null
}

function Test-RunningAsSystem { return ( (whoami -user) -match "S-1-5-18" ) }

function Get-DesktopDir {
  if (Test-RunningAsSystem) { Join-Path -Path $env:PUBLIC -ChildPath "Desktop" }
  else { [Environment]::GetFolderPath("Desktop") }
}

function Get-StartDir {
  if (Test-RunningAsSystem) { Join-Path $env:ALLUSERSPROFILE "Microsoft\\Windows\\Start Menu\\Programs" }
  else { "$([Environment]::GetFolderPath("StartMenu"))\\Programs" }
}

# Preparar la carpeta contenedora en el Escritorio
$DesktopDir = Get-DesktopDir
$ShortcutsFolder = Join-Path $DesktopDir "SharePoint Shortcuts"
if (-not (Test-Path $ShortcutsFolder)) { New-Item -Path $ShortcutsFolder -ItemType Directory | Out-Null }

# Crear el acceso directo
$destinationPath = Join-Path $ShortcutsFolder "$ShortcutDisplayName.lnk"
Add-Shortcut -DestinationPath $destinationPath -ShortcutTargetPath $ShortcutTargetPath -WorkingDirectory $WorkingDirectory

# (Opcional) Crear entrada en el Menú Inicio (Programas)
if ($PinToStart.IsPresent) {
  $destinationPath = Join-Path (Get-StartDir) "$ShortcutDisplayName.lnk"
  Add-Shortcut -DestinationPath $destinationPath -ShortcutTargetPath $ShortcutTargetPath -WorkingDirectory $WorkingDirectory
}

I adskillige rigtige manuskripter har jeg set typiske fejl: at man ikke indfanger værdien af Get-DesktopDir i en variabel (den blev kaldt uden tildeling og derefter refereret til $DesktopDir (forventer at metoden selv indstiller den), uoverensstemmelser i mappenavnet (Sharepoint vs SharePoint) eller brug af en variabel $ShortcutArguments uden at deklarere det som en parameter for Tilføj genvejMed ovenstående mønster, den rækkevidde Det er klart, og alt flyder.

URL-genveje, ikoner, argumenter og andre egenskaber

Mange genvejsegenskaber styres med WSH. De mest almindelige er Målsti (sti til den eksekverbare fil eller URL), argumenter (kommandolinjeparametre), Arbejdsmappe (arbejdsmappe), Ikonplacering (ikonfil med indeks) og WindowStyle (normal, maksimeret, minimeret).

Minimalt eksempel til at oprette en .url som åbner browseren i en virksomhedsrute:

$WshShell = New-Object -ComObject WScript.Shell
$lnk = $WshShell.CreateShortcut("$HOME\\Desktop\\Intranet.URL")
$lnk.TargetPath = "https://intranet.empresa.local"
$lnk.Save()

Husk at du kan pege på filer for ikoner .ico, .dll eller .exeHvis ikonet findes i en DLL eller EXE med flere ressourcer, skal du tilføje ",<indeks>" til slutningen (f.eks. "%WinDir%\\System32\\SHELL32.dll,66"). I VBScript eller VFP indstilles dette med Ikonplacering; i PowerShell, præcis det samme på COM-objektet returneret af CreateShortcut.

Specielle mapper: Skrivebord, Startmenu og mere

For at dine genveje skal vises, hvor de skal, skal du finde den korrekte mappe. WshShell.SpecialFolders Du kan bede om stier som 'Desktop' eller 'AllUsersDesktop', og med shell API'en (i VB6) får du en endnu mere omfattende liste.

Disse er de mest nyttige identifikatorer, der bruges i ældre og nuværende scripts: AlleBrugereSkrivebord, AlleBrugereStartMenu, AlleBrugereProgrammer, AlleBrugereStart, Skrivebord, Favoritter, Skrifttyper, MineDokumenter, NetHood, PrintHood, Programmer, Seneste, SendTil, StartMenu, Start, SkabelonerHvis du vælger hver enkelt, vises genvejen for den aktuelle bruger eller for alle brugere, selv i mappen 'Programmer' i Startmenuen eller i mappen 'Start', så du kan køre noget på én gang. logon.

I et meget komplet historisk VBScript-script (tilskrevet en forfatter ved navn Fernando i 2010) blev der tilbudt et kommandolinjeværktøj til at oprette .lnk- og .url-genveje i en hvilken som helst af disse mapper med parametre som /Navn (obligatorisk), /Fil (særlig mappe), / URL o /Anvendelse (en af ​​de to, for at skelne mellem .url og .lnk), /Ikon e /Indeksikon, /Arbejdsrute, /Kraft y /ArgumenterHjælpen beskrev, hvordan den resulterende fil i tilfælde af .url blev ændret for at indsætte IconFile e IconIndex hvis relevant. Logikken omfattede også kopiering af .ico-ikoner til brugerens midlertidige mappe, hvis det var nødvendigt.

Yderligere automatisering fra PowerShell: .NET, COM og Internet Explorer

Ud over genveje kan du bruge PowerShell .NET-klasser y COM-objekter til flere administrationsopgaver. Nogle klassiske cmdlets fungerer ikke godt via fjernadgang, så brug af .NET er en god måde at redde dagen på.

med System.Diagnostics.EventLog Du kan oprette forbindelse til den lokale eller eksterne hændelseslog, forespørge om tickets, slet det eller skriv begivenheder. Bemærk, hvordan det instantieres, og hvordan postnavnet (og den eksterne computer) sendes som konstruktørargumenter:

# Registro de Aplicación local
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog.Clear()   # Borrado (requiere permisos adecuados)

# Registro remoto (indicando host o IP)
$RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application, 192.168.1.81
$RemoteAppLog.Clear()

For at automatisere COM-applikationer er mønsteret identisk. InternetExplorer.Application du kan starte og styre IE (nyttigt i ældre miljøer), justere Synlig til $true og naviger med Navigere()Husk at lukke med Forlade() og frigiv referencer om nødvendigt.

Katalog over almindelige arbejdsmiljøopgaver (nyttige idéer og minder)

Udover at oprette genveje er WSH blevet brugt i årtier til at automatisere små administrative opgaver. Et klassisk kompendium indeholdt eksempler på udskriv og administrer netværksprinterforbindelser, tilknytte og fjerne drev (MapNetworkDrive og RemoveNetworkDrive), liste netværksressourcer med EnumNetworkDrives, åbn dialogboksen "Vælg mappe", læs regional konfiguration og registreringsværdier med RegRead, skriv ind Kør at starte programmer ved opstart med RegWrite, liste særlige stier, læse CPU-hastigheden fra registreringsdatabasen, tilknytte filtypenavne eller endda ændre systemtastkombinationer i ældre versioner (f.eks. Ctrl + Alt + Del i XP/NT) ved ændringer i registreringsdatabasen.

I dag er næsten alt dette dækket mere robust med PowerShell og gruppepolitikker eller Intune, men WSH er stadig en Schweizisk kniv kompatibel og ekstremt let til engangsscripting.

Noter om kompatibilitet, sikkerhed og bedste praksis

Nogle handlinger (skrivning til Program Files, ændring af registreringsdatabasen under HKLM, manipulation af Hurtig adgang eller den fælles Startmenu) kræver forhøjede privilegierSørg for at køre PowerShell med administratorrettigheder, når destinationen kræver det, eller planlæg din implementering ved hjælp af systemkontoen (f.eks. i Intune med enhedskonteksten).

Hvis du deler scripts, så overvej at signere dem og begrænse deres brug til pålidelige oprindelser og undgå at køre ukontrolleret downloadet kode. I forretningsscenarier er det en god idé at registrere fejl (Try/Catch), logge, hvad der sker, og anvende parametervalidering streng for at undgå at generere ødelagt adgang eller uventede ruter.

Endelig husk det Disse procedurer giver kun mening i WindowsCOM- og WSH-modellen findes ikke på macOS eller Linux. Når krydskompatibilitet er påkrævet, bør systemspecifikke alternativer eller webbaserede tilgange overvejes.

Alt ovenstående lægger op til, at med en fornuftig kombination af WSH og PowerShell, kan du oprette genveje på skrivebordet og i startmenuen med ikoner og argumenter, generere URL-links, justere vinduesstile og arbejdsmapper, løse særlige mapper for bruger eller computer og udnytte .NET-klasser og COM-objekter, når cmdlets ikke fungerer, enten lokalt eller i administrerede implementeringer som f.eks. I harmoni.