Показать полную графическую версию : [решено] Рандомный VolumeID
Здравствуйте
Для тестирования ПО возникла необходимость генерации новых VolumeID диска.
Подскажите пожалуйста пример батника, который бы использовал утилиту Марка Руссиновича (https://technet.microsoft.com/ru-ru/sysinternals/bb897436.aspx) и ее синтаксис?
То есть, при запуске батника должна выполнятся команда:
volumeid.exe C: xxxx-xxxx
где, xxxx-xxxx - рандомный набор букв и цифр.
Anonymоus
05-01-2016, 02:06
@Echo Off
SetLocal EnableDelayedExpansion
:: Набор символов, из которых будет генерироваться ID
Set Charset=0123456789ABCDEF
Set CharsetSize=16
:: инициализируем для получения более качественного рандома
Call :RandomStringGen 12 init
:: Получаем новый ID и устанавливаем его
Call :RandomStringGen 4 IDPart1 && Call :RandomStringGen 4 IDPart2
Echo New Volume ID is [%IDPart1%-%IDPart2%]
volumeid C: %IDPart1%-%IDPart2%
Pause&Exit
:RandomStringGen (length, name)
Set "RndStringLength=%~1" & Set "RndString=%~2"
:loop
Echo !Random!!Random!>nul
Set /A Offset=%CharsetSize%*!Random!/32768
Set %RndString%=!Charset:~%Offset%,1!!%RndString%!
Set /A RndStringLength-=1
If %RndStringLength% GTR 0 GoTo :loop
Exit /B
Код:
@echo off
cmd/c exit/b %random%%random%%random%
echo volumeid.exe C: %=ExitCode:~,4%-%=ExitCode:~4%
pause>nul
.
Если понравится, то "echo" уберите:).
VBScript:
Option Explicit
Dim strNewVolumeID
strNewVolumeID = GetVolumeIDPart() & "-" & GetVolumeIDPart()
WScript.Echo strNewVolumeID
WScript.CreateObject("WScript.Shell").Run """C:\Program Files (x86)\Sysinternals.com\Sysinternals Suite\Volumeid.exe"" C: " & strNewVolumeID & "", 0, True
WScript.Quit 0
Function GetVolumeIDPart()
Randomize Timer
GetVolumeIDPart = Right("0000" & Hex(Int(Rnd() * 2^16)), 4)
End Function
Кстати, про «C:» — проще использовать для этих целей присоединённый виртуальный диск, поскольку ему можно сделать detach/attach сценарием (хоть в том же скрипте/файле, что и генерация и задание VolumeID) без перезагрузки.
greg zakharov
05-01-2016, 10:19
Альтернативные решения (до кучи) без использования Sysinternal'овской утилиты для генерации случайного volume id:powershell /nop /ex bypass "&{(-join [GUID]::NewGuid().Guid[9..17]).ToUpper()}"или0</* :
@cscript /nologo /e:jscript "%~f0" %*&exit /b */0;
(function() {
with (new ActiveXObject('Scriptlet.TypeLib')) {
WScript.echo(GUID.substring(10, 19));
}
}());К слову, в случае с PowerShell можно вообще обойтись без volumeid Руссиновича.
greg zakharov, утилита его не генерирует.
К слову, в случае с PowerShell можно вообще обойтись без volumeid Руссиновича. »
?
greg zakharov
05-01-2016, 15:28
утилита его не генерирует.Все верно, она лишь устанавливает новый id для тома, увы, изначально неправильно выразился.?VolumeId для установки нового серийного номера тома использует DeviceIoControl, вызвать который посредством рефлексии можно следующим образом:
([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object {
$_.ManifestModule.ScopeName.Equals('System.Data.dll')
}).GetType(
'System.Data.SqlTypes.UnsafeNativeMethods'
).GetMethod(
'DeviceIoControl', [Reflection.BindingFlags]40
).Invoke(...)
И если у пользователя достаточно прав, поменять id особой проблемы не составит.
VolumeId для установки нового серийного номера тома использует DeviceIoControl, вызвать который посредством рефлексии можно следующим образом: »
Спасибо, ясно. Рабочий код не хотите попробовать сделать (в целом, вместе с генерацией)?
greg zakharov
05-01-2016, 16:26
Рабочий код не хотите попробовать сделать (в целом, вместе с генерацией)?Можно в принципе. Надо будет на git создать репу как-нибудь и туда код закинуть.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.