Cześć.
Ostatnio postanowiłem usprawnić swoje łączenie przez Windowsowskiego VPNa i napisałem program do takich połączeń.
Problem polega na tym, gdy pobiera dane z pliku (w tym wypadku z kolejnych linii w pliku) to omija puste linie, a chcę aby je odczytywał jako puste bądź null.
Tu kod z podawaniem danych, aby plik się utworzył:
else if(odpRDP == '3')
{
char pytanie;
system("cls");
cout <<"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"<<endl;
podgladWinVPN();
cout <<"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"<<endl;
cin.clear();
cout << "\nCzy polaczenie wymaga uzytkownika i hasla? (t/n)\n";
cin >> pytanie;
if(pytanie == 'n')
{
cout << "\nPodaj nazwe polaczenia:";
cout << "\n(Nazwa musi byc zgodna z nazwa Windows VPN)\n";
cin >> WVPN[nrWvpn].nazwawinvpn;
WVPN[nrWvpn].userwinvpn = "";
WVPN[nrWvpn].haslowinvpn = "";
cout << "\nPodaj nazwe pliku polaczenia RDP:";
cin >> WVPN[nrWvpn].rdpwin;
cin.ignore();
nrWvpn++;
ifstream plik3;
plik3.open("config\\winvpn.ini");
system("cls");
if ( nrWvpn != 0) //musi byc conajmniej 1 element do wypisania
{ //j<i wyswietlanie prawidlowej wartosci i = j-1
cout << "\nDodano polaczenie z "<< WVPN[nrWvpn-1].nazwawinvpn << "." <<endl;
}
else
cout << "\nBrak polaczen w bazie!\n";
system("ping 1.1.1.1 -n 3 -w 3000 > nul");
}
else if(pytanie == 't')
{
cout << "\nPodaj nazwe polaczenia:";
cout << "\n(Nazwa musi byc zgodna z nazwa Windows VPN)\n";
cin >> WVPN[nrWvpn].nazwawinvpn;
cout << "\n Podaj nazwe uzytkowanika:";
cin >> WVPN[nrWvpn].userwinvpn;
cout << "\nPodaj haslo:";
cin >> WVPN[nrWvpn].haslowinvpn;
cout << "\nPodaj nazwe pliku polaczenia RDP:";
cin >> WVPN[nrWvpn].rdpwin;
cin.ignore();
nrWvpn++;
ifstream plik3;
plik3.open("config\\winvpn.ini");
system("cls");
if ( nrWvpn != 0) //musi byc conajmniej 1 element do wypisania
{ //j<i wyswietlanie prawidlowej wartosci i = j-1
cout << "\nDodano polaczenie z "<< WVPN[nrWvpn-1].nazwawinvpn << "." <<endl;
}
else
cout << "\nBrak polaczen w bazie!\n";
system("ping 1.1.1.1 -n 3 -w 3000 > nul");
}
else
{
system("cls");
cout << "\nPodales bledna odpowiedz!\n";
system("ping 1.1.1.1 -n 2 -w 3000 > nul");
}
}
(Zapis plików tworzy się w oddzielnej funkcji, ale chyba w tym wypadku nie jest potrzebna.)
Podany kod powyżej tworzy taki plik:
------BEG------
1 <-Tu zlicza ilość połączeń / ster do wyboru połączenia
Test <-Nazwa połączenia
[i]pusta linia[/i] <-Użytkownik
[i]pusta linia[/i] <-Hasło
test <-Nazwa połączenia RDP
------EOF------
A tu poniżej podaję kod tworzenia pliku PowerShella, który jest uruchamiany przez plik bat.
int numerWVPN()
{
char odp;
do
{
int ok=0;
do
{
system("cls");
cout << "\nPolaczenie WinVPN\n";
cout << "\nWybierz polaczenie:\n\n";
cout <<"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"<<endl;
podgladWinVPN();
cout <<"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"<<endl;
cout << "\n0. Powrot do menu\n\n";
cin.clear();
cin.sync();
cin >> znak;
if (cin.fail())
{
system("cls");
cout << "\nNie podano liczby. Sprobuj wpisac ponownie...\n";
system("ping 1.1.1.1 -n 2 -w 3000 > nul");
cin.clear();
cin.sync();
}
else
{
ok=1;
}
}while(ok==0);
if (nrWvpn != 0)
{
system("cls");
cin.ignore();
if (znak > nrWvpn)
{
system("cls");
cout <<"\nBrak polaczenia o takim numerze.";
system("ping 1.1.1.1 -n 3 -w 3000 > nul");
}
else if(znak == 0)
{
}
else
{
wczytajWinVPN();
ofstream plik5("config\\winvpn.ps1", ios::out);
plik5 <<"$vpnname = " + char2String(znaczek) + WVPN[znak-1].nazwawinvpn + char2String(znaczek)<<endl;
plik5 <<"$vpnusername = " + char2String(znaczek) + WVPN[znak-1].userwinvpn + char2String(znaczek)<<endl;
plik5 <<"$vpnpassword = " + char2String(znaczek) + WVPN[znak-1].haslowinvpn + char2String(znaczek)<<endl;
plik5 <<"$cmd = $env:WINDIR + " + char2String(znaczek) + "\\System32\\rasdial.exe" + char2String(znaczek)<<endl;
plik5 <<"$expression = " + char2String(znaczek) + "$cmd " + char2String(znaczek) + char2String(znaczek) + "$vpnname" + char2String(znaczek) + char2String(znaczek) + " $vpnusername $vpnpassword" + char2String(znaczek)<<endl;
plik5 <<"$con = " + char2String(znaczek) + "$cmd $vpnname /DISCONNECT" + char2String(znaczek)<<endl;
plik5 <<"$vpn = Get-VpnConnection | where {$_.Name -eq $vpnname}"<<endl;
plik5 <<"if ($vpn.ConnectionStatus -eq " + char2String(znaczek) + "Disconnected" + char2String(znaczek) + ")"<<endl;
plik5 <<"{"<<endl;
plik5 <<" Invoke-Expression -Command $expression"<<endl;
plik5 <<"}"<<endl;
plik5 <<"if($vpn.ConnectionStatus -eq "+ char2String(znaczek) + "Connected" + char2String(znaczek) + ")"<<endl;
plik5 <<"{"<<endl;
plik5 <<" Invoke-Expression -Command $con"<<endl;
plik5 <<"}"<<endl;
do
{
cout << "\nPolaczenie z " + WVPN[znak-1].nazwawinvpn + ".\n";
system("start WVPN.bat");
system("pause");
system("cls");
cout << "\nUruchamianie RDPa.\n";
ifstream plik1("config\\sciezka.ini", ios::in);
plik1 >> pathRDP;
system(("start " + char2String(znaczek) + pathRDP + "\\" + WVPN[znak-1].rdpwin + ".RDP" + char2String(znaczek) + " " + char2String(znaczek) + pathRDP + "\\" + WVPN[znak-1].rdpwin + ".RDP" + char2String(znaczek)).c_str());
cout << "\nChcesz ponowic polaczenie? (t/n)\n";
cin >> odp;
}while(odp != 'n');
system("cls");
cout <<"\nZakonczono polaczenie z "<< WVPN[znak-1].nazwawinvpn <<"!";
system("ping 1.1.1.1 -n 2 -w 3000 > nul");
}
}
else
{
if(znak == 0)
{
}
else
{
system("cls");
cout << "\nPodales bledny numer!\n";
system("ping 1.1.1.1 -n 2 -w 3000 > nul");
}
}
}while(znak != 0);
return 0;
}
A tak wygląda plik PowerShella:
$vpnname = "TEST"
$vpnusername = "test"
$vpnpassword = ""
$cmd = $env:WINDIR + "\System32\rasdial.exe"
$expression = "$cmd ""$vpnname"" $vpnusername $vpnpassword"
$con = "$cmd $vpnname /DISCONNECT"
$vpn = Get-VpnConnection | where {$_.Name -eq $vpnname}
if ($vpn.ConnectionStatus -eq "Disconnected")
{
Invoke-Expression -Command $expression
}
if($vpn.ConnectionStatus -eq "Connected")
{
Invoke-Expression -Command $con
}
Nie mam pojęcia jak odczytać puste linie żeby zamiast nazwy połączenia RDP pobierał 2 puste linie tj użytkownik i hasło. Może ktoś coś podpowie?