Войти

Показать полную графическую версию : [решено] Рандомный VolumeID


Freem
05-01-2016, 01:18
Здравствуйте

Для тестирования ПО возникла необходимость генерации новых 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

Georgio
05-01-2016, 02:47
Код:

@echo off

cmd/c exit/b %random%%random%%random%

echo volumeid.exe C: %=ExitCode:~,4%-%=ExitCode:~4%

pause>nul

.

Если понравится, то "echo" уберите:).

Iska
05-01-2016, 03:27
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 Руссиновича.

Iska
05-01-2016, 12:52
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 особой проблемы не составит.

Iska
05-01-2016, 15:46
VolumeId для установки нового серийного номера тома использует DeviceIoControl, вызвать который посредством рефлексии можно следующим образом: »
Спасибо, ясно. Рабочий код не хотите попробовать сделать (в целом, вместе с генерацией)?

greg zakharov
05-01-2016, 16:26
Рабочий код не хотите попробовать сделать (в целом, вместе с генерацией)?Можно в принципе. Надо будет на git создать репу как-нибудь и туда код закинуть.




© OSzone.net 2001-2012