Сбой чтения результатов icacls /save с помощью объекта FSO в VBScript

Мне нужно сохранить результаты выполнения команды ICACLS, изменить их и восстановить измененные разрешения обратно. Я использую VBScript, чтобы сделать это. Проблема в том, что чтение строк или целых данных из сохраненного дает мне 1 символ и кучу пробелов в результате. Но если я попытаюсь прочитать содержимое полученных данных, загруженных ICACLS, char-by-char, и распечатать их на лету, это покажет правильное содержимое.

Const ForReading=1 'I/O modes
dim FolderToSetPermissions,ShellObj,FSO,EffectivePermissionsFile,CurrentLine,ParentFolderName,ParentFolderObj
FolderToSetPermissions="c:\test"
Set FSO = CreateObject("Scripting.FileSystemObject")
ParentFolderName=FSO.GetParentFolderName(wscript.ScriptFullName)
Set ParentFolderObj =fso.GetFolder(ParentFolderName)    
Set ShellObj = WScript.CreateObject("WScript.Shell")
ShellObj.run "icacls.exe """&FolderToSetPermissions&"""\* /save " & ParentFolderObj.path & "\EffectivePermissions.txt /t", 0, True
set EffectivePermissionsFile =FSO.OpenTextFile(ParentFolderObj.path & "\EffectivePermissions.txt",ForReading,False)
Do Until EffectivePermissionsFile.AtEndOfStream
'CurrentLine=EffectivePermissionsFile.Read(1) ' works fine if prints right after 
 'reading from file. Concatenating all the chars in file causes the same result as 
 'reading the file by lines or with .ReadAll function of FSO
 CurrentLine= EffectivePermissionsFile.ReadLine
 WScript.Echo CurrentLine
Loop
EffectivePermissionsFile.Close

Я подозреваю, что проблема в самом ICACLS: он не пишет действительно текстовый файл. Я нашел другого человека, который столкнулся с ситуацией ( https://windowssecrets.com/forums/showthread.php/150866-Win7-ICACLS-redirected-output-and-NOTEPAD-don-t-play-well-together).

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

1 ответ

Прочитав сотни страниц, я наконец нашел решение! Эта функция преобразует текст, созданный icacls <file or folder> /save <filename> /T от кодовой страницы UCS-2 до UTF-8:

Sub UTFConvert(filename)
  Set fso = CreateObject("Scripting.FileSystemObject")
  txt = fso.OpenTextFile(filename, 1, False, -1).ReadAll

  Set stream = CreateObject("ADODB.Stream")
  stream.Open
  stream.Type     = 2 'text
  stream.Position = 0
  stream.Charset  = "utf-8"
  stream.WriteText txt
  stream.SaveToFile filename, 2
  stream.Close
End Sub

Получающийся текст становится читаемым с VBScript впоследствии.

Взял ответ отсюда: Конвертация UCS-2 Little Endian в UTF-8 оставляет файл с большим количеством нежелательных символов

Другие вопросы по тегам