Patch level :10.0 268 (solo cd)
Files correlati : Ricompilazione Demo : [ ] Commento : 0001236: installazione su Vista Descrizione in caso di sistema operativo = vista l'installazione standard permette solo di installare come terminal server. Dei nostri clienti nessuno mi risulta abbia vista come server, sicuramente ne abbiamo come postazioni singole e come client (es. cliente Maya ). git-svn-id: svn://10.65.10.50/trunk@18602 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
224e375269
commit
90d4eb9aa9
@ -1,5 +1,5 @@
|
|||||||
[MAIN]
|
[MAIN]
|
||||||
OEM =
|
OEM = 0
|
||||||
|
|
||||||
[OEM_0]
|
[OEM_0]
|
||||||
Administrator = ’—’Œ<EFBFBD>
|
Administrator = ’—’Œ<EFBFBD>
|
||||||
|
127
setup/utils.cpp
127
setup/utils.cpp
@ -15,6 +15,133 @@ int GetSessionId()
|
|||||||
return (int) session;
|
return (int) session;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//lista delle versioni di windows
|
||||||
|
#define WUNKNOWNSTR _T("unknown Windows version")
|
||||||
|
|
||||||
|
#define W95STR _T("Windows 95")
|
||||||
|
#define W95SP1STR _T("Windows 95 SP1")
|
||||||
|
#define W95OSR2STR _T("Windows 95 OSR2")
|
||||||
|
#define W98STR _T("Windows 98")
|
||||||
|
#define W98SP1STR _T("Windows 98 SP1")
|
||||||
|
#define W98SESTR _T("Windows 98 SE")
|
||||||
|
#define WMESTR _T("Windows ME")
|
||||||
|
|
||||||
|
#define WNT351STR _T("Windows NT 3.51")
|
||||||
|
#define WNT4STR _T("Windows NT 4")
|
||||||
|
#define W2KSTR _T("Windows 2000")
|
||||||
|
#define WXPSTR _T("Windows XP")
|
||||||
|
#define W2003STR _T("Windows Server 2003")
|
||||||
|
#define WVISTASTR _T("Windows Vista")
|
||||||
|
#define W2008STR _T("Windows Server 2008")
|
||||||
|
#define W7STR _T("Windows 7")
|
||||||
|
|
||||||
|
#define WCESTR _T("Windows CE")
|
||||||
|
|
||||||
|
|
||||||
|
//metodo per provare a trovare la versione di windows
|
||||||
|
bool GetWinVer(LPTSTR lpszVersion, int nVersionSize, int *pnVersion)
|
||||||
|
{
|
||||||
|
int nVersion = WUNKNOWN;
|
||||||
|
LPCTSTR cp = WUNKNOWNSTR;
|
||||||
|
|
||||||
|
OSVERSIONINFO osinfo; memset(&osinfo, 0, sizeof(osinfo));
|
||||||
|
osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
||||||
|
if (::GetVersionEx(&osinfo))
|
||||||
|
{
|
||||||
|
DWORD dwPlatformId = osinfo.dwPlatformId;
|
||||||
|
DWORD dwMinorVersion = osinfo.dwMinorVersion;
|
||||||
|
DWORD dwMajorVersion = osinfo.dwMajorVersion;
|
||||||
|
DWORD dwBuildNumber = osinfo.dwBuildNumber & 0xFFFF; // Win 95 needs this
|
||||||
|
|
||||||
|
if ((dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (dwMajorVersion == 4))
|
||||||
|
{
|
||||||
|
if ((dwMinorVersion < 10) && (dwBuildNumber == 950))
|
||||||
|
{
|
||||||
|
cp = W95STR;
|
||||||
|
nVersion = W95;
|
||||||
|
}
|
||||||
|
else if ((dwMinorVersion < 10) &&
|
||||||
|
((dwBuildNumber > 950) && (dwBuildNumber <= 1080)))
|
||||||
|
{
|
||||||
|
cp = W95SP1STR;
|
||||||
|
nVersion = W95SP1;
|
||||||
|
}
|
||||||
|
else if ((dwMinorVersion < 10) && (dwBuildNumber > 1080))
|
||||||
|
{
|
||||||
|
cp = W95OSR2STR;
|
||||||
|
nVersion = W95OSR2;
|
||||||
|
}
|
||||||
|
else if ((dwMinorVersion == 10) && (dwBuildNumber == 1998))
|
||||||
|
{
|
||||||
|
cp = W98STR;
|
||||||
|
nVersion = W98;
|
||||||
|
}
|
||||||
|
else if ((dwMinorVersion == 10) &&
|
||||||
|
((dwBuildNumber > 1998) && (dwBuildNumber < 2183)))
|
||||||
|
{
|
||||||
|
cp = W98SP1STR;
|
||||||
|
nVersion = W98SP1;
|
||||||
|
}
|
||||||
|
else if ((dwMinorVersion == 10) && (dwBuildNumber >= 2183))
|
||||||
|
{
|
||||||
|
cp = W98SESTR;
|
||||||
|
nVersion = W98SE;
|
||||||
|
}
|
||||||
|
else if (dwMinorVersion == 90)
|
||||||
|
{
|
||||||
|
cp = WMESTR;
|
||||||
|
nVersion = WME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (dwPlatformId == VER_PLATFORM_WIN32_NT)
|
||||||
|
{
|
||||||
|
if (dwMajorVersion == 3)
|
||||||
|
{
|
||||||
|
cp = WNT351STR;
|
||||||
|
nVersion = WNT351;
|
||||||
|
}
|
||||||
|
else if (dwMajorVersion == 4)
|
||||||
|
{
|
||||||
|
cp = WNT4STR;
|
||||||
|
nVersion = WNT4;
|
||||||
|
}
|
||||||
|
else if (dwMajorVersion == 5)
|
||||||
|
{
|
||||||
|
switch (dwMinorVersion)
|
||||||
|
{
|
||||||
|
case 0: cp = W2KSTR; nVersion = W2K; break;
|
||||||
|
case 1: cp = WXPSTR; nVersion = WXP; break;
|
||||||
|
case 2:
|
||||||
|
default: cp = W2003STR; nVersion = W2003; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (dwMajorVersion == 6)
|
||||||
|
{
|
||||||
|
cp = WVISTASTR;
|
||||||
|
nVersion = WVISTA;
|
||||||
|
// TBI: Windows 2008 Server
|
||||||
|
}
|
||||||
|
else if (dwMajorVersion >= 7)
|
||||||
|
{
|
||||||
|
cp = W7STR;
|
||||||
|
nVersion = W7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* else if (dwPlatformId == VER_PLATFORM_WIN32_CE)
|
||||||
|
{
|
||||||
|
cp = WCESTR;
|
||||||
|
nVersion = WCE;
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lpszVersion != NULL && nVersionSize > 0)
|
||||||
|
_tcsncpy(lpszVersion, cp, nVersionSize-1);
|
||||||
|
if (pnVersion != NULL)
|
||||||
|
*pnVersion = nVersion;
|
||||||
|
|
||||||
|
return nVersion == WUNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
wxString GetWindowsProgramDirectory()
|
wxString GetWindowsProgramDirectory()
|
||||||
{
|
{
|
||||||
//scelta della directory di installazione di default
|
//scelta della directory di installazione di default
|
||||||
|
@ -36,6 +36,34 @@ public:
|
|||||||
CampoProgressDialog(const wxString& strTitle, int nMaximum = 100, wxWindow* pParent = NULL);
|
CampoProgressDialog(const wxString& strTitle, int nMaximum = 100, wxWindow* pParent = NULL);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//numeri delle versioni di windows
|
||||||
|
#define WUNKNOWN 0
|
||||||
|
|
||||||
|
#define W9XFIRST 1
|
||||||
|
#define W95 1
|
||||||
|
#define W95SP1 2
|
||||||
|
#define W95OSR2 3
|
||||||
|
#define W98 4
|
||||||
|
#define W98SP1 5
|
||||||
|
#define W98SE 6
|
||||||
|
#define WME 7
|
||||||
|
#define W9XLAST 99
|
||||||
|
|
||||||
|
#define WNTFIRST 101
|
||||||
|
#define WNT351 101
|
||||||
|
#define WNT4 102
|
||||||
|
#define W2K 103
|
||||||
|
#define WXP 104
|
||||||
|
#define W2003 105
|
||||||
|
#define WVISTA 106
|
||||||
|
#define W2008 107
|
||||||
|
#define W7 108
|
||||||
|
#define WNTLAST 199
|
||||||
|
|
||||||
|
#define WCEFIRST 201
|
||||||
|
#define WCE 201
|
||||||
|
#define WCELAST 299
|
||||||
|
|
||||||
//metodi generici
|
//metodi generici
|
||||||
//finestre messaggio,errore,ecc...
|
//finestre messaggio,errore,ecc...
|
||||||
bool ErrorBox(const wxString str);
|
bool ErrorBox(const wxString str);
|
||||||
@ -51,6 +79,7 @@ void NormalizeSlash(wxString& strFileName);
|
|||||||
//interfaccia con windows
|
//interfaccia con windows
|
||||||
wxString GetWindowsProgramDirectory();
|
wxString GetWindowsProgramDirectory();
|
||||||
int GetSessionId();
|
int GetSessionId();
|
||||||
|
bool GetWinVer(LPTSTR lpszVersion, int nVersionSize, int *pnVersion);
|
||||||
|
|
||||||
size_t ListNetworkDisks(wxArrayString& asList);
|
size_t ListNetworkDisks(wxArrayString& asList);
|
||||||
size_t ListSharedDirectories(wxArrayString& asList);
|
size_t ListSharedDirectories(wxArrayString& asList);
|
||||||
|
@ -840,14 +840,7 @@ public:
|
|||||||
bool CampoWizardPage5::ForwardValidate()
|
bool CampoWizardPage5::ForwardValidate()
|
||||||
{
|
{
|
||||||
// controlla il tipo di installazione!
|
// controlla il tipo di installazione!
|
||||||
InstallationType nType = it_standalone;
|
InstallationType nType = InstallationType(m_pRadioBox->GetSelection() + 1);
|
||||||
|
|
||||||
const int nSessionId = GetSessionId();
|
|
||||||
//nessun SessionId -> installazione comune -> selection dal radiobutton
|
|
||||||
if (nSessionId == 0)
|
|
||||||
nType = InstallationType(m_pRadioBox->GetSelection() + 1);
|
|
||||||
else //SessionId != 0 -> Terminal Server -> installazione di tipo Server obbligata!!!
|
|
||||||
nType = it_server;
|
|
||||||
|
|
||||||
GetWizard().SetInstallationType(nType);
|
GetWizard().SetInstallationType(nType);
|
||||||
return true;
|
return true;
|
||||||
@ -855,13 +848,14 @@ bool CampoWizardPage5::ForwardValidate()
|
|||||||
|
|
||||||
CampoWizardPage5::CampoWizardPage5(wxWizard* parent) : CampoWizardPage(parent)
|
CampoWizardPage5::CampoWizardPage5(wxWizard* parent) : CampoWizardPage(parent)
|
||||||
{
|
{
|
||||||
//chiede al sistema se e' in modalita' termserv (win2003/2008srv)
|
//chiede al sistema la versione di windows
|
||||||
const int nSessionId = GetSessionId();
|
int nVersion = 0;
|
||||||
|
::GetWinVer(NULL, 0, &nVersion);
|
||||||
|
|
||||||
//Istruzioni per l'uso!
|
//Istruzioni per l'uso!
|
||||||
wxString strTitle = wxT("Scelta del tipo di installazione");
|
wxString strTitle = wxT("Scelta del tipo di installazione");
|
||||||
wxString strBody;
|
wxString strBody;
|
||||||
if (nSessionId == 0)
|
|
||||||
{
|
|
||||||
strBody = wxT("<p><b>Standard (scelta consigliata)</b>. Installazione su postazione singola, con programmi e dati sul disco locale del computer</p>");
|
strBody = wxT("<p><b>Standard (scelta consigliata)</b>. Installazione su postazione singola, con programmi e dati sul disco locale del computer</p>");
|
||||||
strBody += wxT("<p><b>Installazioni di rete</b> (per utenti esperti)</p>");
|
strBody += wxT("<p><b>Installazioni di rete</b> (per utenti esperti)</p>");
|
||||||
strBody += wxT("<p><b>Server</b>: Computer in rete sul quale sono presenti una copia, utilizzata o meno, dei programmi (server programmi) e l’area dati (server dati). ");
|
strBody += wxT("<p><b>Server</b>: Computer in rete sul quale sono presenti una copia, utilizzata o meno, dei programmi (server programmi) e l’area dati (server dati). ");
|
||||||
@ -869,31 +863,33 @@ CampoWizardPage5::CampoWizardPage5(wxWizard* parent) : CampoWizardPage(parent)
|
|||||||
strBody += wxT("e deve essere installata per prima!</p>");
|
strBody += wxT("e deve essere installata per prima!</p>");
|
||||||
strBody += wxT("<p><b>Client</b>: Computer in rete sul quale e' presente una copia dei programmi ma non l'area dati. ");
|
strBody += wxT("<p><b>Client</b>: Computer in rete sul quale e' presente una copia dei programmi ma non l'area dati. ");
|
||||||
strBody += wxT("I client possono essere installati solo dopo l'installazione del server!</p>");
|
strBody += wxT("I client possono essere installati solo dopo l'installazione del server!</p>");
|
||||||
}
|
|
||||||
else
|
//sistema multissesione remoto (win2003srv etc.)
|
||||||
|
if (nVersion >= W2003)
|
||||||
{
|
{
|
||||||
strBody += wxT("<p><b>Terminal Server</b>: Computer con sistema operativo tipo Windows 2003/2008 Server. ");
|
strBody += wxT("<p></p>");
|
||||||
strBody += wxT("L'installazione e' unica e viene utilizzata dagli utenti di sistema quando aprono una sessione sul server.</p>");
|
strBody += wxT("<p>E' stata rilevata una versione di Windows che consente sessioni remote (es. Windows 2008 Server)</p>");
|
||||||
strBody += wxT("<p>Selezionando configurazione Terminal Server <i>e' necessario</i> installare il gestore delle autorizzazioni per ");
|
strBody += wxT("<p>Questa versione di Windows supporta un ulteriore tipo di installazione di <b><i>PRODUCT</i></b>: </p>");
|
||||||
strBody += wxT("poter gestire l'accesso contemporaneo di piu' utenti.</p>");
|
strBody += wxT("<p><b>Terminal Server:</b> L'installazione e' unica e viene utilizzata dagli utenti di sistema quando aprono una sessione sul server.");
|
||||||
|
strBody += wxT("In questo caso <i>e' necessario scegliere l'installazione Server ed installare il gestore delle autorizzazioni!</i>");
|
||||||
|
strBody += wxT("ATTENZIONE! Selezionare l'installazione tipo Terminal Server solo se necessario!</p>");
|
||||||
}
|
}
|
||||||
SetHTMLText(strTitle, strBody);
|
SetHTMLText(strTitle, strBody);
|
||||||
|
|
||||||
//radiobutton con i tipi di installazione
|
//radiobutton con i tipi di installazione
|
||||||
wxArrayString asInstType;
|
wxArrayString asInstType;
|
||||||
if (nSessionId == 0)
|
|
||||||
{
|
|
||||||
asInstType.Add("Standard");
|
asInstType.Add("Standard");
|
||||||
asInstType.Add("Server");
|
asInstType.Add("Server");
|
||||||
asInstType.Add("Client");
|
asInstType.Add("Client");
|
||||||
}
|
|
||||||
else
|
int nDefault = nVersion < W2003 ? 0 : 1;
|
||||||
asInstType.Add("Terminal Server");
|
|
||||||
|
|
||||||
m_pRadioBox = new wxRadioBox(this, 501, "Selezionare il tipo di installazione", wxDefaultPosition,
|
m_pRadioBox = new wxRadioBox(this, 501, "Selezionare il tipo di installazione", wxDefaultPosition,
|
||||||
wxDefaultSize, asInstType, 0, wxRA_SPECIFY_ROWS);
|
wxDefaultSize, asInstType, 0, wxRA_SPECIFY_ROWS);
|
||||||
|
|
||||||
//setta il default a Standard
|
//setta il default a Standard
|
||||||
m_pRadioBox->SetSelection(0);
|
m_pRadioBox->SetSelection(nDefault);
|
||||||
GetSizer()->Add(m_pRadioBox);
|
GetSizer()->Add(m_pRadioBox);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1106,12 +1102,14 @@ bool CampoWizardPage7::ForwardValidate()
|
|||||||
|
|
||||||
CampoWizardPage7::CampoWizardPage7(wxWizard* parent) : CampoWizardPage(parent)
|
CampoWizardPage7::CampoWizardPage7(wxWizard* parent) : CampoWizardPage(parent)
|
||||||
{
|
{
|
||||||
const int nSessionId = GetSessionId();
|
//chiede al sistema la versione di windows
|
||||||
|
int nVersion = 0;
|
||||||
|
::GetWinVer(NULL, 0, &nVersion);
|
||||||
|
|
||||||
wxString strTitle;
|
wxString strTitle;
|
||||||
wxString strBody;
|
wxString strBody;
|
||||||
|
|
||||||
if (nSessionId == 0)
|
//installazione di tipo Server normale
|
||||||
{
|
|
||||||
strTitle = wxT("Installazione di tipo Server");
|
strTitle = wxT("Installazione di tipo Server");
|
||||||
strBody = wxT("<p>Digitare nel campo <b>'Cartella programma'</b> il percorso completo della cartella dove si desidera installare il programma. ");
|
strBody = wxT("<p>Digitare nel campo <b>'Cartella programma'</b> il percorso completo della cartella dove si desidera installare il programma. ");
|
||||||
strBody += wxT("Il percorso consigliato e' <i>C:\\APPNAME</i> </p>");
|
strBody += wxT("Il percorso consigliato e' <i>C:\\APPNAME</i> </p>");
|
||||||
@ -1127,10 +1125,12 @@ CampoWizardPage7::CampoWizardPage7(wxWizard* parent) : CampoWizardPage(parent)
|
|||||||
strBody += wxT("<p><b>Modalita' di esecuzione programmi di gestione</b><br>");
|
strBody += wxT("<p><b>Modalita' di esecuzione programmi di gestione</b><br>");
|
||||||
strBody += wxT("<u>Come servizi:</u> i programmi di gestione vengono eseguiti come servizi di Windows; questa e' la modalita' consigliata ed e' obbligatoria in caso di installazione con Windows 2003/2008<br>");
|
strBody += wxT("<u>Come servizi:</u> i programmi di gestione vengono eseguiti come servizi di Windows; questa e' la modalita' consigliata ed e' obbligatoria in caso di installazione con Windows 2003/2008<br>");
|
||||||
strBody += wxT("<u>Nel menu esecuzione automatica:</u> i programmi di gestione vengono eseguiti automaticamente al primo accesso di un utente al server di PRODUCT; usare questa modalita' solo nell'impossibilita' di utilizzare la precedente</p>");
|
strBody += wxT("<u>Nel menu esecuzione automatica:</u> i programmi di gestione vengono eseguiti automaticamente al primo accesso di un utente al server di PRODUCT; usare questa modalita' solo nell'impossibilita' di utilizzare la precedente</p>");
|
||||||
}
|
|
||||||
else
|
//se si ha un sistema multissesione remota (es. win2003srv ecc.)
|
||||||
|
if (nVersion >= W2003)
|
||||||
{
|
{
|
||||||
strTitle = wxT("Installazione di tipo Terminal Server");
|
strTitle = wxT("Installazione di tipo Terminal Server");
|
||||||
|
strBody += wxT("<p>E' stata rilevata una versione di Windows che consente sessioni remote (es. Windows 2008 Server) ed è quindi possibile una installazione di questo tipo</p>");
|
||||||
strBody = wxT("<p>Digitare nel campo <b>'Cartella programma'</b> il percorso completo della cartella dove si desidera installare il programma. ");
|
strBody = wxT("<p>Digitare nel campo <b>'Cartella programma'</b> il percorso completo della cartella dove si desidera installare il programma. ");
|
||||||
strBody += wxT("Il percorso consigliato e' <i>C:\\APPNAME</i> </p>");
|
strBody += wxT("Il percorso consigliato e' <i>C:\\APPNAME</i> </p>");
|
||||||
strBody += wxT("<p>Digitare nel campo <b>'Cartella dati'</b> il percorso completo della cartella dove si desidera installare l'area dati. ");
|
strBody += wxT("<p>Digitare nel campo <b>'Cartella dati'</b> il percorso completo della cartella dove si desidera installare l'area dati. ");
|
||||||
@ -1178,10 +1178,10 @@ CampoWizardPage7::CampoWizardPage7(wxWizard* parent) : CampoWizardPage(parent)
|
|||||||
//check installa authoriz
|
//check installa authoriz
|
||||||
wxCheckBox* chAuthoriz = new wxCheckBox(this, 705, wxT("Installa il gestore delle autorizzazioni"));
|
wxCheckBox* chAuthoriz = new wxCheckBox(this, 705, wxT("Installa il gestore delle autorizzazioni"));
|
||||||
//e' obbligatorio installare authoriz in caso di terminal server!
|
//e' obbligatorio installare authoriz in caso di terminal server!
|
||||||
if (nSessionId == 0)
|
if (nVersion >= W2003)
|
||||||
chAuthoriz->SetValue(false);
|
|
||||||
else
|
|
||||||
chAuthoriz->SetValue(true);
|
chAuthoriz->SetValue(true);
|
||||||
|
else
|
||||||
|
chAuthoriz->SetValue(false);
|
||||||
|
|
||||||
gbsSizer->Add(chAuthoriz, wxGBPosition(2, 1));
|
gbsSizer->Add(chAuthoriz, wxGBPosition(2, 1));
|
||||||
//server authoriz
|
//server authoriz
|
||||||
@ -1202,13 +1202,15 @@ CampoWizardPage7::CampoWizardPage7(wxWizard* parent) : CampoWizardPage(parent)
|
|||||||
//quinta riga della griglia
|
//quinta riga della griglia
|
||||||
//radiobutton con i tipi di installazione
|
//radiobutton con i tipi di installazione
|
||||||
wxArrayString asInstType;
|
wxArrayString asInstType;
|
||||||
if (nSessionId == 0)
|
if (nVersion >= W2003)
|
||||||
|
{
|
||||||
|
asInstType.Add("Come servizi (obbligatorio)");
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
asInstType.Add("Come servizi (consigliato)");
|
asInstType.Add("Come servizi (consigliato)");
|
||||||
asInstType.Add("Nel menu esecuzione automatica");
|
asInstType.Add("Nel menu esecuzione automatica");
|
||||||
}
|
}
|
||||||
else
|
|
||||||
asInstType.Add("Come servizi (obbligatorio)");
|
|
||||||
|
|
||||||
m_pRadioBox = new wxRadioBox(this, 709, "Modalita' di esecuzione gestori", wxDefaultPosition,
|
m_pRadioBox = new wxRadioBox(this, 709, "Modalita' di esecuzione gestori", wxDefaultPosition,
|
||||||
wxDefaultSize, asInstType, 0, wxRA_SPECIFY_COLS);
|
wxDefaultSize, asInstType, 0, wxRA_SPECIFY_COLS);
|
||||||
@ -1546,9 +1548,6 @@ bool CampoWizardPage10::TransferDataToWindow()
|
|||||||
switch (_uInstallType)
|
switch (_uInstallType)
|
||||||
{
|
{
|
||||||
case it_server: //server
|
case it_server: //server
|
||||||
if (GetSessionId() > 0)
|
|
||||||
_strInstallType = "Terminal Server";
|
|
||||||
else
|
|
||||||
_strInstallType = "Server";
|
_strInstallType = "Server";
|
||||||
_strPrgLocPath = cw.GetPrgLocPath();
|
_strPrgLocPath = cw.GetPrgLocPath();
|
||||||
_strDataPath = cw.GetDataPath();
|
_strDataPath = cw.GetDataPath();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user