Totalny w-file tym razem. Tyle, że rozwiązany :)

Problem – zautomatyzować operację dodawania wpisów w BCD, żeby skryptem dodawać Pingwina do boot menu w Windows 7.

Pierwszy krok prosty: dodajemy wpis dla grub4dos – http://grub4dos.sourceforge.net/wiki/index.php/Grub4dos_tutorial#Booting_GRUB_for_DOS_via_the_Windows_Vista_boot_manager

Teraz wypada by to przenieść na inną maszynę – chwilka przekopywania się przez dokumentację i okazuje się, że BCDEdit umożliwia import i export ustawień. piknie – robić backup i potem go odzyskać na innej maszynie. Niestety nie działa. Z tego prostego powodu, że wpis dla W7 nie ma GUID {current}, tylko jakiś dziwoląg – niestety GUIDy są generowane pseudolosowo. Efekt: pingwin się podnosi, Windows nie ^^

Rozwiązania są dwa:

1. Wykorzystać WMI i BCDProvider (http://msdn.microsoft.com/en-us/library/aa362675(v=VS.85).aspx) i można zrobić tak (wymaga wcześniejszego dodania wpisów):

set args = WScript.Arguments
num = args.Count

if num <> 1 then
  WScript.Echo "Usage: CScript \nologo [Menu Selection]"
  WScript.Quit 1
end if

MenuPick=args.Item(0)

Const BcdLibraryString_Description = &h12000004
Const BootMgrId = "{9dea862c-5cdd-4e70-acc1-f32b344d4795}"
Const DefaultType = &h23000003
Const WindowsImages = &h10200003

strComputer = "."
Set objStoreClass = GetObject("winmgmts:{(Backup,Restore)}\" & _
strComputer & "rootwmi:BcdStore")
objStoreClass.OpenStore "", objStore
objStore.EnumerateObjects WindowsImages, colObjects
For Each objObject in colObjects
  objObject.GetElement BcdLibraryString_Description, objElement
  If Instr(objElement.String, MenuPick) Then
    objStore.OpenObject BootMgrId, objBootMgr
    objBootMgr.SetObjectElement DefaultType, objObject.ID
  End If
Next

2. wykręcić pętlę w CMD:

for /f "tokens=3" %%a in ('bcdedit -create -d "PJWSTK Linux"  -application bootsector') do set guid=%%a
bcdedit /set %guid% device boot
bcdedit /set %guid% path grldr.mbr
bcdedit /displayorder %guid% /addlast

działa pięknie – po prostu pobiera trzecie słowo z outputu BCDEDIT – to ZAWSZE jest GUID :)

teraz można to wrzucić jako cmd /c “%scriptroot%bcd.cmd” do Task Sequence w MDT i mamy zautomatyzowane dodawanie pingwinów na W7 :D

PS. warto pamiętać, ze sysprep kasuje zawartość BCD :)

Spread the love

Comments (1)

  1. maggreg

    Odpowiedz

    Witam
    Czy zawsze trzecie słowo?

    Mam sporo różnych skryptów do BCD i guid jest w nich ustawiony na dwójkę.
    A oto przykład wprowadzenia komendy bezpośrednio:
    http://img697.imageshack.us/img697/576/obrazzeschowka.png

    Jak widać – guid jest drugi.
    Trójka jest jak najbardziej prawidłowa ale w systemie z językiem angielskim (ew bez bcdedit.exe.mui):
    http://img836.imageshack.us/img836/9315/obrazzeschowka1.png

    Skoro ten sposób nie jest “language independent” to trzeba by do skryptu wprowadzić sprawdzanie wersji językowej, oczywiście można w katalogu ze skryptem umieścić bcdedot.exe wraz z angielskim bcdedit.exe.mui.
    Tak czy siak myślę, że wypada dodać informację o tym pod skryptem.

    Przy okazji – ja łączę skrypty VBS z CMD, dzięki temu zyskuję dodatkowe możliwość unikając dostępu przed BCDProvider który w moim odczuciu jest dość mało przejrzysty (na tle innych WMI).
    Oto taki przykładowy skrypt:
    http://wklej.to/1Ilw

    pzdr

Zostaw komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Time limit is exhausted. Please reload CAPTCHA.