Witam, mam takie pytanie. Czy jest ktoś wstanie poratować informacjami na temat korzystnych rozwiązań oraz o jakie biblioteki czy frameworki można się oprzeć tworząc oprogramowanie do pełnego zarządzania komputerami w sieci zamkniętej LAN.
Cel: Właśnie został wdrożony nowy projekt, który zastąpił pracowników Botami. Program komunikuje się z specjalną stworzoną przez nas platformową. Problem jaki mamy jest to iż komputery pracują na modemach 3G i są często restartowane by uzyskać nowe IP co sprawia poważne problemy w sytuacji gdy chcemy się zdalnie zalogować na komputer włączyć aktualizacje, czy je po prostu zrestartować.
Ogólnie jest dużo programów, do zarządzania jednak też je chcemy zautomatyzować ;) Dla tego chcemy postawić własną platformę.
Na czym nam zależy, na początku.
- Mieć możliwość włączenia wybranego lub całej grupy komputerów
- Mieć możliwość restartowania komputerów
Myślę że to jest trywialne i można się oprzeć na wywoływaniu skryptów. Przydała by się możliwość manipulacji plikami oraz odpalaniu procesów exe wraz z ich podglądem.
Myślę, że w tym przypadku musiał bym jeszcze wystawić klienta ;)
Oraz możliwość do pobierania informacji czy komputer pracuje, oraz czy ma dostęp do internetu zewnętrznego.
2 pytanie czy miał ktoś odczynienia z modemami 3G lub potrafił by mi pomóc z tą klasą, przyznam się szczerze wiozłem gotowca, przez dłuższy czas działało lecz z starszymi modemami zaczęło wybijać iż Callback::Invoke jest przeciążony, sytuacja zdarza się raz na 1000, czyli raz na 2 dni na jednej maszynie, przy starych modemach i słabym zasięgu.
Lecz w sytuacji gdy chcemy kompy chcemy postawić a Niemczech i Anglii muszę załatać jakoś tą dziurę
public class RasManager
{
public const int RAS_MaxEntryName = 256;
public const int RAS_MaxPhoneNumber = 128;
public const int UNLEN = 256;
public const int PWLEN = 256;
public const int DNLEN = 15;
public const int MAX_PATH = 260;
public const int RAS_MaxDeviceType = 16;
public const int RAS_MaxCallbackNumber = RAS_MaxPhoneNumber;
public delegate void Callback(uint unMsg, int rasconnstate, int dwError);
[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Auto)]
public struct RASDIALPARAMS
{
public int dwSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxEntryName + 1)]
public string szEntryName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxPhoneNumber + 1)]
public string szPhoneNumber;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxCallbackNumber + 1)]
public string szCallbackNumber;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = UNLEN + 1)]
public string szUserName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = PWLEN + 1)]
public string szPassword;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = DNLEN + 1)]
public string szDomain;
public int dwSubEntry;
public int dwCallbackId;
}
[DllImport("rasapi32.dll", CharSet = CharSet.Auto)]
public static extern int RasDial(int lpRasDialExtensions, string
lpszPhonebook,
ref RASDIALPARAMS lprasdialparams, int dwNotifierType,
Callback lpvNotifier, ref int lphRasConn);
private RASDIALPARAMS RasDialParams;
private int Connection;
public RasManager()
{
Connection = 0;
RasDialParams = new RASDIALPARAMS();
RasDialParams.dwSize = Marshal.SizeOf(RasDialParams);
}
#region Properties
public string UserName
{
get
{
return RasDialParams.szUserName;
}
set
{
RasDialParams.szUserName = value;
}
}
public string Password
{
get
{
return RasDialParams.szPassword;
}
set
{
RasDialParams.szPassword = value;
}
}
public string EntryName
{
get
{
return RasDialParams.szEntryName;
}
set
{
RasDialParams.szEntryName = value;
}
}
#endregion
public int Connect()
{
Callback rasDialFunc = new Callback(RasManager.RasDialFunc);
RasDialParams.szEntryName += "\0";
RasDialParams.szUserName += "\0";
RasDialParams.szPassword += "\0";
int result = RasDial(0, null, ref RasDialParams, 0, rasDialFunc, ref
Connection);
GC.Collect();
return result;
}
public static void RasDialFunc(uint unMsg, int rasconnstate, int dwError)
{
}
}