Рандомный VolumeID
Здравствуйте
Для тестирования ПО возникла необходимость генерации новых VolumeID диска.
Подскажите пожалуйста пример батника, который бы использовал утилиту Марка Руссиновича и ее синтаксис?
То есть, при запуске батника должна выполнятся команда:
volumeid.exe C: xxxx-xxxx
где, xxxx-xxxx - рандомный набор букв и цифр.
|
Код:
@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 2591249 |
Альтернативные решения (до кучи) без использования 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, утилита его не генерирует.
Цитата:
Цитата greg zakharov
К слову, в случае с PowerShell можно вообще обойтись без volumeid Руссиновича. »
|
?
|
greg zakharov |
05-01-2016 15:28 2591351 |
Цитата:
Цитата Iska
утилита его не генерирует.
|
Все верно, она лишь устанавливает новый 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 особой проблемы не составит.
|
Цитата:
Цитата greg zakharov
VolumeId для установки нового серийного номера тома использует DeviceIoControl, вызвать который посредством рефлексии можно следующим образом: »
|
Спасибо, ясно. Рабочий код не хотите попробовать сделать (в целом, вместе с генерацией)?
|
greg zakharov |
05-01-2016 16:26 2591366 |
Цитата:
Цитата Iska
Рабочий код не хотите попробовать сделать (в целом, вместе с генерацией)?
|
Можно в принципе. Надо будет на git создать репу как-нибудь и туда код закинуть.
|
Время: 12:07.
© OSzone.net 2001-