Hey Dimitar,

I am exited to find another developer experimenting on the issue of running
serviced vms on windows hosts. Maybe you have read about my project
VBoxVmService, which aims in a similar direction but is way more fragmented
than your approach. If you are thinking about any further development of
your code, I believe it would be a great idea to team up our resources
instead of bringing up two parallel tools for the same purpose. 

You can get into contact with me via email or via the virtualbox forums
(forums.virtualbox.org). My username there is "mattz".

Best regards, Mathias


-----Ursprüngliche Nachricht-----
Von: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] Im Auftrag von
[EMAIL PROTECTED]
Gesendet: Mittwoch, 26. November 2008 16:05
An: [email protected]
Betreff: vbox-dev Digest, Vol 25, Issue 14

Send vbox-dev mailing list submissions to
        [email protected]

To subscribe or unsubscribe via the World Wide Web, visit
        http://vbox.innotek.de/mailman/listinfo/vbox-dev
or, via email, send a message with subject or body 'help' to
        [EMAIL PROTECTED]

You can reach the person managing the list at
        [EMAIL PROTECTED]

When replying, please edit your Subject line so it is more specific
than "Re: Contents of vbox-dev digest..."


Today's Topics:

   1. Auto start VM as Windows service (Dimitar Pashev)


----------------------------------------------------------------------

Message: 1
Date: Wed, 26 Nov 2008 17:05:14 +0200
From: Dimitar Pashev <[EMAIL PROTECTED]>
Subject: [vbox-dev] Auto start VM as Windows service
To: [email protected]
Message-ID: <[EMAIL PROTECTED]>
Content-Type: text/plain; charset="windows-1251"

I wrote simple service appication that start all machines /via
VBoxHeadless.exe/ which have !EnableAutoStart string in description

ProjectFiles attached below.

VMStart() and VMStop()

//
// Purpose:
//   Start all machines which have !EnableAutoStart sting in description
//
// Parameters:
//   None
//
// Return value:
//   0: Error, 1:Success
//
int VMStart()
{
    wchar_t szExePath[_MAX_PATH];//VBoxHeadless path
    CComBSTR    bstrHomePath;
    HRESULT hr;
    unsigned long i,max_i;

    CComPtr<IVirtualBox> vbox;
    CComPtr<IMachineCollection> machines;

    //Get Virtualbox install dir
    CRegKey key;
    if( ERROR_SUCCESS !=
key.Open(HKEY_LOCAL_MACHINE,L"SOFTWARE\\Sun\\xVM VirtualBox",KEY_READ )
) return 0; // on error exit
    ULONG ulen = MAX_PATH-1;
    if( ERROR_SUCCESS !=
key.QueryStringValue(L"InstallDir",szExePath,&ulen) ) return 0;
    key.Close();

    wcsncat(szExePath,L"VBoxHeadless.exe",_MAX_PATH);

    hr = vbox.CoCreateInstance(CLSID_VirtualBox);
    if(S_OK != hr) return 0;
    hr = vbox->get_Machines(&machines);
    if(S_OK == hr) hr = machines->get_Count(&max_i);
    if(S_OK != hr) return 0;

    for( i=0;i<max_i;i++) {
        CComPtr<IMachine> machine;
        hr = machines->GetItemAt(i,&machine);
        if(S_OK != hr) continue;
        CComBSTR temp;
        hr = machine->get_Description(&temp);
        if( hr != S_OK ||NULL == temp || NULL ==
wcsstr(temp,L"!EnableAutoStart") ) continue;

        CComBSTR name;

        //construct command line
        hr = machine->get_Name(&name);
        temp = TEXT(" -v config -s ");
        temp += name;

        //create process
        STARTUPINFO si;
        memset(&si,0,sizeof(si));
        si.cb = sizeof(si);
        PROCESS_INFORMATION pi;
        int ret = CreateProcess(szExePath,temp,0,0,0,
            CREATE_NEW_PROCESS_GROUP|DETACHED_PROCESS,
            0,0,&si,&pi);
        ret = GetLastError();
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);


    }
    return 1;
}
//
// Purpose:
//   Stop all running VM's which have !EnableAutoStart sting in description
//
// Parameters:
//   None
//
// Return value:
//   0: Error, 1:Success
//
int VMStop()
{
    CComPtr<IVirtualBox> vbox;
    CComPtr<IMachineCollection> machines;
    HRESULT hr;
    unsigned long i,max_i;

    hr = vbox.CoCreateInstance(CLSID_VirtualBox);
    if(S_OK != hr) return 0;
    hr = vbox->get_Machines(&machines);
    if(S_OK == hr) hr = machines->get_Count(&max_i);
    if(S_OK != hr) return 0;
    for( i=0;i<max_i;i++) {
        CComPtr<IMachine>    machine;
        MachineState        vmstate;

        hr = machines->GetItemAt(i,&machine);
        if(S_OK != hr) continue;


        //check for autostart flag
        CComBSTR temp;
        hr = machine->get_Description(&temp);
        if( hr != S_OK ||NULL == temp || NULL ==
wcsstr(temp,L"!EnableAutoStart") ) continue;

        //check for running state
        machine->get_State(&vmstate);
        if( MachineState_Running == vmstate || MachineState_Starting ==
vmstate ) {
            GUID vmID;
            CComPtr<ISession>   sess;
            CComPtr<IConsole>   console;
            hr    = machine->get_Id(&vmID);
            hr  = sess.CoCreateInstance(CLSID_Session);
            if(S_OK == hr ) hr = vbox->OpenExistingSession(sess,vmID);
            if(S_OK == hr ) hr = sess->get_Console(&console);
            if(S_OK == hr ) hr = console->PowerButton();
            if(S_OK == hr ) hr = sess->Close();
        }
    }
    return 1;
}
------------------------------------
Usage
install service: VBoxAutoStartSvc -install <user> <password>
remove  service: VBoxAutoStartSvc -remove

I hope this will be useful.



-------------- next part --------------
A non-text attachment was scrubbed...
Name: VBoxAutoStartSvc.zip
Type: application/x-zip-compressed
Size: 25368 bytes
Desc: not available
Url :
http://vbox.innotek.de/pipermail/vbox-dev/attachments/20081126/c23d028e/atta
chment.bin 

------------------------------

_______________________________________________
vbox-dev mailing list
[email protected]
http://vbox.innotek.de/mailman/listinfo/vbox-dev


End of vbox-dev Digest, Vol 25, Issue 14
****************************************


_______________________________________________
vbox-dev mailing list
[email protected]
http://vbox.innotek.de/mailman/listinfo/vbox-dev

Reply via email to