.vbs отсортировать список избранных пользователей - PullRequest
0 голосов
/ 12 апреля 2011

Общая цель этого сценария: отправить сотрудникам и добавить набор избранного (веб-папки) на каждый ноутбук.До сих пор я написал (поставил и адаптировал) скрипт для добавления всех папок в избранное, но они добавляются в конец списка избранного.

Я ищу способ сортировки списка избранных по дате или, что еще лучше, чтобы вставить папку в верхнюю часть списка, чтобы она не изменяла порядок избранного текущего пользователя.* Это то, что я имею до сих пор, ссылки не будут работать, так как они находятся в нашей внутренней сети

'Create Network Folder*******************************************  


Option Explicit  
MsgBox("Click OK to begin installing all of the Web Folders under My Network Places.")


Sub CreateNetworkFolder(siteURL, siteName)  

Dim iRes, jRes, MT, TT  
Dim SH, newPath  
Dim objFso, f, fs, g  

Dim bString  
Dim ltrIndex  
Dim nameLength, urlLength, urlCutoff  
Dim aFile  
Dim filesys

'ForWriting (2) is the attribute to be set when writing to a file.  
Const ForWriting = 2  

nameLength = Len(siteName)  
urlLength = Len(siteURL)  
'44 seems to be the length where we have to change a 00 to a 01.  
urlCutoff = 44  

Set objFso = CreateObject("Scripting.FileSystemObject")  

Set SH = WScript.CreateObject("WScript.Shell")  

'Create the folder under Favorites that will hold the target.lnk file  
newPath = SH.SpecialFolders("Favorites") & "\" & "BCKM" & "\"  

'Creating the housing folder for BCKM
Set filesys = CreateObject("Scripting.FileSystemObject")

If filesys.FolderExists(newPath) Then
   'msgbox "File esists"
  else
   'msgbox "file does not exist"
   objFso.CreateFolder(newPath) 
End If



'Create the webfolder for each section
newPath = SH.SpecialFolders("Favorites") & "\" & "BCKM" & "\" & siteName 
objFso.CreateFolder(newPath) 

'We ceate a Desktop.ini file  
Set fs = CreateObject("Scripting.FileSystemObject")  
aFile = newPath & "\Desktop.ini"  

Set f = fs.OpenTextFile( aFile, ForWriting, True )  

'Write the data lines that will make this a folder shortcut.  
f.WriteLine "[.ShellClassInfo]"  
f.WriteLine "CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}"  
f.WriteLine "Flags=2"  
f.WriteLine "ConfirmFileOp=0" 



f.Close  

'We make Desktop.ini a system-hidden file by assigning it attribute of 6  
Set fs = CreateObject("Scripting.FileSystemObject")  
Set g = fs.GetFile(newPath & "\Desktop.ini")  
g.Attributes = 6  

'We make the folder read-only by assigning it 1.  
Set fs = CreateObject("Scripting.FileSystemObject")  
Set g = fs.GetFolder(newPath)  
g.Attributes = 1  

'This is where we construct the target.lnk file byte by byte. Most of  
'the lines are shown in 16 byte chunks,  
'mostly because that is the way I saw it in the Debug utility I was  
'using to inspect shortcut files.  

'Line 1, 16 bytes  
bString = Chr(&H4C) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H01) & Chr(&H14) & Chr(&H02) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&HC0) & Chr(&H00) & Chr(&H00) & Chr(&H00)  

'Line 2, 16 bytes  
bString = bString & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H46) & Chr(&H81) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00)  

'Line 3, 16 bytes  
bString = bString & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00)  

'Line 4., 16 bytes. 13th byte is significant.  
bString = bString & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H01) & Chr(&H00) & Chr(&H00) & Chr(&H00)  

'Line 5. 13th byte is significant.  
bString = bString & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00)  

'When I was analyzing the next byte of shortcuts I created, I found  
'that it is set to various values,  
'and I have no idea what they are referring to. In desperation I tried  
'substituting some values.  
'00 caused a crash of Explorer. FF seeems to work fine for all.  
'If anyone can get back to me on what this byte is or why FF works,  
'please contact me.  
bString = bString & Chr(&HFF)  

'This byte is 00 if the URL is 44 characters or less, 01 if greater.  
If urlLength > urlCutoff Then  
bString = bString & Chr(&H01)  
Else  
bString = bString & Chr(&H00)  
End If  

bString = bString & Chr(&H14) & Chr(&H00)  

'Line 6, 16 bytes  
bString = bString & Chr(&H1F) & Chr(&H50) & Chr(&HE0) & Chr(&H4F) & Chr(&HD0) & Chr(&H20) & Chr(&HEA) & Chr(&H3A) & Chr(&H69) & Chr(&H10) & Chr(&HA2) & Chr(&HD8) & Chr(&H08) & Chr(&H00) & Chr(&H2B) & Chr(&H30)  

'Line 7, 16 bytes  
bString = bString & Chr(&H30) & Chr(&H9D) & Chr(&H14) & Chr(&H00) & Chr(&H2E) & Chr(&H00) & Chr(&H00) & Chr(&HDF) & Chr(&HEA) & Chr(&HBD) & Chr(&H65) & Chr(&HC2) & Chr(&HD0) & Chr(&H11) & Chr(&HBC) & Chr(&HED)  

'Line 8, 16 bytes  
bString = bString & Chr(&H00) & Chr(&HA0) & Chr(&HC9) & Chr(&H0A) & Chr(&HB5) & Chr(&H0F) & Chr(&HA4)  

'This byte is 00 if the URL is 44 characters or less, 01 if greater.  
If urlLength > urlCutoff Then  
bString = bString & Chr(&H01)  
Else  
bString = bString & Chr(&H00)  
End If  

bString = bString & Chr(&H4C) & Chr(&H50) & Chr(&H00) & Chr(&H01) & Chr(&H42) & Chr(&H57) & Chr(&H00) & Chr(&H00)  

'Line 9, 16 bytes  
bString = bString & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H10) & Chr(&H00)  

'Line 10, 2 bytes  
bString = bString & Chr(&H00) & Chr(&H00)  

'The next byte represents the length of the site name.  
bString = bString & Chr(nameLength)  

'Take the site name, and write each letter, preceeded by a "00"  
'character.  

For ltrIndex = 1 to nameLength  
bString = bString & Chr(&H00) & Mid(siteName, ltrIndex, 1)  
Next  

'Middle line, separates the Folder Name from the URL. 3 bytes.  
bString = bString & Chr(&H00) & Chr(&H00) & Chr(&H00)  

'The next byte represents the length of the site URL.  
bString = bString & Chr(urlLength)  

'Take the site URL, and write each letter, preceeded by a "00"  
'character.  
For ltrIndex = 1 to urlLength  
bString = bString & Chr(&H00) & Mid(siteURL, ltrIndex, 1)  
Next  

'Last line, 13 bytes  
bString = bString & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00) & Chr(&H00)  

'Let's create the target.lnk file.  
Set fs = CreateObject("Scripting.FileSystemObject")  
aFile = newPath & "\target.lnk"  
'aFile = newPath & "\vb.sss"  
Set f = fs.OpenTextFile(aFile, ForWriting, True)  
f.Write bString  
f.Close  

End Sub  

'This is where you specify the folders to add

CreateNetworkFolder "http://collaboration.au.xxx.com/dav/1.11.685732/", "Clients" 
CreateNetworkFolder "http://collaboration.au.xxx.com/dav/1.11.685930/", "Workspaces" 
CreateNetworkFolder "http://collaboration.au.xxx.com/dav/1.11.685941/", "Practice Management" 
CreateNetworkFolder "http://collaboration.au.xxx.com/dav/1.11.685945/", "Tips" 
CreateNetworkFolder "http://collaboration.au.xxx.com/dav/1.21.8015/", "Discussion Board" 


MsgBox("All Web Folders Added Succesfully. Please check Favorites to Confirm. Press OK") 

Ответы [ 2 ]

2 голосов
/ 16 октября 2013

Чтобы продолжить ответ Хелен, «недокументированные данные» в разделе реестра представляют собой двоичную форму относительного PCUITEMID_CHILD (см. MSDN) - относительно папки, в которой файлы .lnk хранятся на диске.Для этого необходимо использовать язык, который может обращаться к интерфейсам COM, например C ++.

. Раздел реестра имеет заголовок, как описано в статье, однако записи представляют собой просто длину записи (DWORD), то есть порядок'значение (DWORD) и данные PCUITEMID_CHILD.

typedef struct _FAV_ORDERED_HEADER_
{
    DWORD dwFormatValue;    // Typically 8 for known Windows versions that use this
    DWORD dwSubFormatValue; // Typically 2 for known Windows that use this
    DWORD dwTotalDataLen;   // Total bytes in all data
    DWORD dwReserved;       // No known use
    DWORD dwNumRecords;     // Number of records
} FAV_ORDERED_HEADER;

typedef struct _FAV_ORDERED_RECORD_
{
    DWORD dwLenRecord;       // Length of each record (skip this bytes to get next record)
    DWORD dwOrderValue;      // Negative if not ordered (add to end), positive if on list first
    ITEMIDLIST pidlLinkData; // PIDL data for the individiual link - need to use a PIDL compare to be able to compare to actual .lnk file links.
} FAV_ORDERED_RECORD;
  1. Сначала используйте SHGetFolderLocation (NULL, CSIDL_FAVORITES, NULL, NULL и & ppidlFabilities), чтобы получить PIDLIST_ABSOLUTE 100 папки избранного.*

  2. Получить указатель интерфейса рабочего стола IShellFolder с помощью SHGetDesktopFolder ()

  3. Используйте экземпляр IShellFolder для доступа к избранному IShellFolder с помощью IShellFolder :: BindToObject (ppidlFoving,NULL, IID_IShellFolder, & pFabilitiesShellFolder)

  4. Используйте pFabilitiesShellFolder с вызовами IShellFolder :: GetDisplayNameOf () с данными в параметре pidl - и установите параметры SHGDNF для строки (строк) вget - отображаемое имя, URL и т. д. обычно получают с помощью этого метода.

Это относится к Windows 7/8 «Избранное» в ссылках оболочки.Однако для этого необходимо использовать IKnownFolderManager :: GetFolder (FOLDERID_Links, & pLinksKnFolder), чтобы получить IKnownFolder, который позволит в конечном итоге получить требуемый IShellFolder - чтобы правильно получить его PIDLIST_ABSOLUTE.Это ключ реестра (для заказа ссылок):

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Modules\CommonPlaces
0 голосов
/ 21 апреля 2011

Прежде всего, почему вы создаете ярлыки таким странным способом? Это можно сделать намного проще, вызвав WshShell.CreateShortcut и установив свойства результирующего объекта WshShortcut.


Теперь к вашему вопросу сортировки. Существует два раздела реестра, которые управляют состоянием избранного:

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Favorites - соответствует избранным, отображаемым в Internet Explorer.
  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Favorites - соответствует избранным, отображаемым в меню «Пуск» Windows> Избранное.

Порядок сортировки избранного хранится в значении DWORD Order этих ключей. Для каждой папки в Избранном есть соответствующий подраздел, который также имеет значение Order. Внутренняя структура значения Order не документирована, но эта статья дает некоторый анализ и объяснение.

Таким образом, чтобы изменить порядок сортировки, вы можете попытаться изменить это значение из своего скрипта, например, используя методы WMI StdRegProv.GetDWORDValue и StdRegProv.SetDWORDValue. Тем не менее, я думаю, это будет довольно сложно.

Обратите внимание, что удаление этих вышеупомянутых ключей из реестра должно отсортировать избранное в алфавитном порядке , если это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...