Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Рандомный VolumeID (http://forum.oszone.net/showthread.php?t=309963)

Freem 05-01-2016 01:18 2591199

Рандомный VolumeID
 
Здравствуйте

Для тестирования ПО возникла необходимость генерации новых VolumeID диска.
Подскажите пожалуйста пример батника, который бы использовал утилиту Марка Руссиновича и ее синтаксис?

То есть, при запуске батника должна выполнятся команда:
volumeid.exe C: xxxx-xxxx

где, xxxx-xxxx - рандомный набор букв и цифр.

Anonymоus 05-01-2016 02:06 2591206

Код:

@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 2591208

Код:

Код:

@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 2591213

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 Руссиновича.

Iska 05-01-2016 12:52 2591293

greg zakharov, утилита его не генерирует.

Цитата:

Цитата greg zakharov
К слову, в случае с PowerShell можно вообще обойтись без volumeid Руссиновича. »

?

greg zakharov 05-01-2016 15:28 2591351

Цитата:

Цитата Iska
утилита его не генерирует.

Все верно, она лишь устанавливает новый id для тома, увы, изначально неправильно выразился.
Цитата:

Цитата Iska
?

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 2591356

Цитата:

Цитата greg zakharov
VolumeId для установки нового серийного номера тома использует DeviceIoControl, вызвать который посредством рефлексии можно следующим образом: »

Спасибо, ясно. Рабочий код не хотите попробовать сделать (в целом, вместе с генерацией)?

greg zakharov 05-01-2016 16:26 2591366

Цитата:

Цитата Iska
Рабочий код не хотите попробовать сделать (в целом, вместе с генерацией)?

Можно в принципе. Надо будет на git создать репу как-нибудь и туда код закинуть.


Время: 12:07.

Время: 12:07.
© OSzone.net 2001-