wbadmin backup todas as unidades locais

1

Estou tentando encontrar um script de wbadmin de tamanho único que possa ser implantado em uma variedade de servidores do Server 2008 R2.

A pegadinha que estou tendo é que enquanto todos os servidores possuem um C :, alguns têm um E :, alguns um E: e um F: e alguns têm apenas um F:.

O seguinte comando:

wbadmin enable backup -addtarget:\backup1\Backups -schedule:23:00 -systemState -allCritical -vssFull -user:[email protected] -password:ladidada -quiet

Faz o backup apenas do C: e não vejo nenhuma opção em wbadmin para fazer backup de todas as unidades locais. E, claro, se eu tentar fotografar o problema com uma metralhadora (adicionando -include:c:,d:,e:,f: ... etc), obteremos ERROR - The path specified by 'g:' was not found .

Por favor, não me diga que eu tenho que enumar todas as unidades locais e fazê-lo dessa maneira. Existe QUALQUER maneira de informar wbadmin para incluir todas unidades locais ao fazer o backup?

    
por Mark Henderson 13.04.2011 / 08:08

3 respostas

2

Aqui está uma variação que evita automaticamente o cd / dvd. Faz backup apenas de discos rígidos deliberadamente.

@echo off

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

set remotebackup=\backupserver\path

for /F "usebackq eol=: skip=1 tokens=1" %%a in (
  'wmic logicaldisk where "drivetype=3" get deviceid'
) do (
  set "_drive=%%a:"
  set "_HDL=!_HDL!!_drive:~0,2!,"
)
if "%_HDL:~-1%"=="," (set _HDL=%_HDL:~0,-1%)
if "%_HDL:~-2%"==",:" (set _HDL=%_HDL:~0,-2%)

echo Found: %_HDL%

wbadmin start backup -backuptarget:%remotebackup% -include:!_HDL! -allCritical -vssCopy -quiet -systemState

Isso faz parte de uma tarefa agendada, e é por isso que wbadmin start é usado em vez de wbadmin enable .

Os bits de interesse aqui são "drivetype=3" e usando usebackq (obrigatório).

O código de Mark foi útil para rastrear isso.

As instruções if removem a última vírgula ou vírgula e dois pontos, se existirem. Não foi possível pensar em uma maneira mais fácil de fazer isso. %%a é copiado em _drive para que possa ser ajustado aos dois primeiros caracteres (C :) usando a sintaxe :~0,2 .

    
por 03.10.2011 / 22:26
0

enquanto uma solução que procurava a lista de drives do wmi seria melhor. Se você sabe que só tem e: f: e g: então isso funcionará bem

set wbinclude=
if exist e:\*.* set wbinclude=e:\
if exist f:\*.* set wbinclude=%wbinclude% f:\
if exist g:\*.* set wbinclude=%wbinclude% f:\
if not "%wbinclude%"=="" set wbinclude=-includes %wbinclude%

echo wbadmin enable backup -addtarget:\backup1\Backups -schedule:23:00 -systemState -allCritical -vssFull -user:[email protected] -password:ladidada -quiet %wbinclude%
    
por 13.04.2011 / 16:57
0

Depois de um monte de mucking ao redor (eu odeio DOS batching), eu vim com o seguinte. Parece funcionar bem:

@echo off

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /f %%I IN (
 'wmic volume get driveletter'
) DO (
  ECHO %%I | FIND ":"
  IF ERRORLEVEL 1 (
   echo Failed: %%I
  ) ELSE (
   ECHO %%I | FIND "D:"
   IF ERRORLEVEL 1 (
     IF NOT [!_TEMPVAR!]==[] SET _TEMPVAR=!_TEMPVAR!,
     SET _TEMPVAR=!_TEMPVAR!%%I
    ) ELSE (
      echo Skipping CD-ROM
    )
  )

)

wbadmin enable backup -addtarget:\backupserver\Backups -schedule:23:00 -systemState -allCritical -vssFull -user:[email protected] -password:1234password -quiet -include:!_TEMPVAR!

Uma dissecação é:

A primeira parte do lote encontra todas as letras de unidade de wmic volume get driveletter . Ele verifica se cada linha é realmente uma letra de unidade válida (pois a saída inclui algumas informações detalhadas que não são necessárias) verificando o caractere : .

Em seguida, ele verifica se a unidade é a D: , pois, na minha situação, todas são unidades óticas, que causam erros quando especificadas em wbadmin e as ignoram.

Em seguida, ele verifica se a string tem conteúdo. Em caso afirmativo, sufixa uma vírgula ( , ). Se a string está em branco, não faz nada.

Em seguida, vai e acrescenta a letra da unidade à variável.

O, executa wbadmin :

  • wbadmin enable backup - especifica que queremos configurar um agendamento do Backup do Windows
  • -addtarget:\enetsbackup1\Backups - Eu quero fazer backup em um local de rede, então estou especificando aqui.
  • -schedule:23:00 - Eu quero que os backups sejam executados às 23h todas as noites
  • -systemState - Eu quero o estado do sistema incluído para restaurações bare-metal
  • -allCritical - Eu quero todas as unidades de sistema críticas incluídas (isso é importante porque o script acima apenas constrói letras de unidade visíveis . Pode haver partições que precisem de backup para inicializar o servidor que não tem letras de unidade)
  • -vssFull - Este é o backup somente que estamos fazendo neste servidor, portanto, informe ao Windows Backup para redefinir o bit arquivado.
  • -user:[email protected] - Essa é a conta que é membro do grupo Operadores de backup no domínio (e também precisa estar no grupo de operadores de cópia local . Isso é muito mal documentado pela Microsoft)
  • -password:1234password - A senha da conta do serviço de backup
  • -quiet - não faz nenhum aviso. Eu vou estar executando isso como um script de inicialização em uma política de grupo, então os prompts são ruins.
  • -include:!_TEMPVAR! - Esta é a parte mais crítica. Ele especifica quais unidades devem ser submetidas a backup e inclui a cadeia de unidades que coletamos anteriormente.

E apenas para confirmar que funcionou, verifique na GUI:

Coisas que provavelmente podem ser melhoradas: em vez de executar letras de unidade, o GUID da unidade pode ser uma ideia mais inteligente, porque não fará backup de unidades que não estejam montadas com letras de unidade . Portanto, se você montou um disco dentro de uma partição NTFS, ou se a unidade não tiver uma letra de unidade por algum motivo, ela será ignorada.

    
por 13.04.2011 / 11:35