Μήπως είναι καλό να φταχθεί ενα tread με καθε είδος scripts ?
Αντιμετωπίζω ένα πρόβλημα ή μάλλον θέλω να φτιάξω μια σελίδα η οποία να εμφανίζει τα scheduled tasks ενός Domain, (πολλά serverakia)
Με τους servers είναι εντάξει μέσω LDAP queries. Aλλά το να κάνεις enumerate τα scheduled tasks ενός server win2k+ που έχουν φτιαχθεί μέσω task scheduler θεώρησα ότι είναι εύκολη υπόθεση. (Όχι όμως!).
Και μην βιαστεί κάνεις γρήγορος να φωνάξει command line tool ή WMI , γιατί στο μέν πρώτο απλά δεν με καλύπτει ενώ στο δεύτερο έχασα μια ημέρα να καταλάβω (RTFM) γιατί στον πρώτο (DEV) server το script έπαιζε ενώ σε κανέναν άλλο.
To WMI query που έτρεξα είναι:
"SELECT * FROM Win32_ScheduledJob"
Το πρόβλημα είναι ότι το παραπάνω WMI Query χρησιμοποιεί το AT API αντί του Task scheduler API Ver 1.0 για win2lk , winxp , win2003.
Η Microsoft έχει ανακινώσει πολλά καλούδια για την Version 2.0 μα με όλα τα παραδείγματα σε C++!!
και ο πόνος...
#include "stdafx.h"
#include <windows.h>
#include <initguid.h>
#include <ole2.h>
#include <mstask.h>
#include <msterr.h>
#include <wchar.h>
#define TASKS_TO_RETRIEVE 5
int main(int argc, char **argv)
{
HRESULT hr = S_OK;
ITaskScheduler *pITS;
/////////////////////////////////////////////////////////////////
// Call CoInitialize to initialize the COM library and
// then call CoCreateInstance to get the Task Scheduler object.
/////////////////////////////////////////////////////////////////
hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_CTaskScheduler,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITaskScheduler,
(void **) &pITS);
if (FAILED(hr))
{
CoUninitialize();
return hr;
}
}
else
{
return hr;
}
/////////////////////////////////////////////////////////////////
// Call ITaskScheduler::Enum to get an enumeration object.
/////////////////////////////////////////////////////////////////
IEnumWorkItems *pIEnum;
hr = pITS->Enum(&pIEnum);
pITS->Release();
if (FAILED(hr))
{
CoUninitialize();
return hr;
}
/////////////////////////////////////////////////////////////////
// Call IEnumWorkItems::Next to retrieve tasks. Note that
// this example tries to retrieve five tasks for each call.
/////////////////////////////////////////////////////////////////
LPWSTR *lpwszNames;
DWORD dwFetchedTasks = 0;
while (SUCCEEDED(pIEnum->Next(TASKS_TO_RETRIEVE,
&lpwszNames,
&dwFetchedTasks))
&& (dwFetchedTasks != 0))
{
///////////////////////////////////////////////////////////////
// Process each task. Note that this example prints the
// name of each task to the screen.
//////////////////////////////////////////////////////////////
while (dwFetchedTasks)
{
wprintf(L"%s\n", lpwszNames[--dwFetchedTasks]);
CoTaskMemFree(lpwszNames[dwFetchedTasks]);
}
CoTaskMemFree(lpwszNames);
}
pIEnum->Release();
CoUninitialize();
return S_OK;
}
απλα να στο εμφανίσει τα tasks στην οθονη...
sorry για την χρήση των C# tags