Author Archives: Jiří Kanda

Programátorská hádanka – catch & throw

Jaký je rozdíl v prapagaci výjimky z bloku catch:

try
{
...
}
catch (Exception e)
{
   throw;
}

versus

try
{
...
}
catch (Exception e)
{
   throw e;
}

Odpověď je tentokrát jednoduchá a jako obvykle ji najdete o řádku níže napsanou bílým písmem (pro odtajnění třeba označte):

>>> Při vyhození výjimkt přes „throw;“ se nezmění stack trace – výjimka se stále tváří, že vzešla z původní metody. Při vyhození přes „throw e;“ je změněn stack trace, výjimka se tváří, že vzešla z naší metody obsluhující výjimku. <<<

Css styly a obrázky nefungují v IIS7

Instalace IIS7 ve Windows Vista obsahuje více možností než tomu bylo dříve. V dobré víře jsem si zvolil nástroje pro správu a podporu ASP.NET v minimalistické podobě.

Díky podpoře nainstalovené podpoře ASP.NET fungovaly webové aplikace, ovšem statický obsah (jako jsou právě obrázky nebo soubory kaskádových stylů) prohlížeč neobdržel. Při zadání libovolné URL na statický obsah (například i adresa k obrázku, který ani na disku není) prohlížeč nezobrazí nic (i zdrojový kód stránky je prázdný).

Aby IIS7 poskytoval statický obsah, je nutné mezi instalovanými komponentami IIS zvolit i „Statický obsah“.

Programátorská hádanka – Výjimka ve výjimkách

Jaký je rozdíl v zachytávání výjimek při použití typu výjimky Exception

try
{
...
}
catch (Exception e)
{
...
}

a bez použití tohoto typu, tedy

try
{
...
}
catch
{
...
}

Zdůrazňuji, že tento rozdíl existuje jen v .NET Frameworku 1.x, ve verzi 2.0 jsou způsoby funkčně rovnocenné.

Odpověď najdete o řádku níže napsanou bílým písmem (pro odtajnění třeba označte):

>>> Konstrukce catch (Exception e) zachytává jen CLS-compliant výjimky, catch zachytává všechny chyby. Praktický rozdíl je při zachytávání chyb z COM objektů, jejichž chyby nejsou CLS-compliant výjimkami. .NET Framework 2.0 tyto chyby z COM objektů zabalí do RuntimeWrappedException, které jsou CLS-compliant, takže je chyba zachycena i při použití catch (Exception e).  <<<

…a jako posledně: teď se přiznejte, kdo jste to znal!

Nastavení portu služby Remote Desktop

Nastavení portu, na kterém poslouchá služba Remote Desktop, se nachází v registrech zde:

  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp\PortNumber

Vypnutí beeperu aneb jak udělat, aby počítač po změně hlasitosti nepípal

Beeper způsobuje pípání počítače z Windows, zejména na velmi nežádoucím místě – po změně hlasitosti ve standardním ovládání hlasitosti. Naštěstí lze beeper vypnout a to tímto postupem:

  • Spustit správce zařízení
  • V menu zobrazit vybrat Zobrazit skrytá zařízení
  • Najít Beeper v sekci Ovladače nepodporující technologii Plug and Play
  • Pravé tlačítko a vlastnosti beeperu
  • Kliknout tlačítko zastavit
  • Vybrat ze seznamu Typ položku Zakázáno
  • Potvrdit, že jsme si jistí a že chceme restartovat počítač

Postup ověřen ve Windows XP.

Podepisování maker v Excelu

Čas od času je potřeba do dokumentu excelu (nebo nějakého exportu) vpravit makro. Uživatelé pak musí potvrzovat, že chtějí dokument skutečně otevřít, přestože obsahuje makra.

Toto lze usnadnit podepsáním maker, je pak rozpoznán zdroj makra (podepsáno shodným certifikátem) a stačí, aby uživatel povolil otevření dokumentu s makry jen jednou. Nastaví-li uživatel „Vždy důvěřovat makrům z tohoto zdroje“, není upozorněním o makrech příště obtěžován.

Import certifikátu

Pokud požádáme o certifikát cartifikační autoritu (zde např. Thawte), při tvorbě žádosti nám prohlížeč na disk vyrobí privátní klík k certifikátu. Poté, co je naše žádost vyřízena, je potřeba importovat vyrobený certifikát do systému. Certifikát od CA však neobsahuje privátní klíč, což je z principu správně. Abychom mohli podepisovat makra, musíme do systému importovat certifikát získaný od CA spolu s privátním klíčem – potřebujeme tedy soubory propojit.

Importovat certifikáty popsaným způsobem lze pomocí Office 2000 Tool: PVK Digital Certificate Files Importer. Po stažení a instalaci pustíme z příkazového řádku:

pvkimprt "c:\example directory\mycertificate.spc" "c:\privatekey\mycertificate.pvk" 

čímž certifikát importujeme i s privátním klíčem.

Upozornění: Instalační program se jmenuje shodně jako instalovaný program (pvkimprt), tak pozor, co se z příkazové řádky pouští!

Podepsání maker

Makra se potom v excelu podepíší tímto způsobem:

  • Otevřít dokument podepisovanými makry
  • Menu Nástroje, Makro, Editor jazyka Visual Basic
  • Menu Tools, Digital Signature…
  • Zvolit…
  • Vybrat importovaný certifikát
  • Potvrdit okna

Makra jsou podepsána až při uložení dokumentu, tzn. že případné chyby nejsou oznámeny při zavírání oken, ale až při ukládání.

Poznámka: Podepsaná makra fungují i při uložení a následném otevření nejen ve formátu XLS, ale např. i v MHT.

Nelze použít Maintenance Plan Wizzard v SQL 2005 Management Studiu (jen na x64 verzi)

Při pokusu použít Maintenance Plan Wizzard v SQL 2005 Management studiu jsem získal při pokusu o naplánování úlohy chybu, že to není možné. Po instalaci SP1 se situace změnila v tom duchu, že Maintenance Plan Wizzard nebylo možné otevřít vůbec – Studio si stěžovalo na blíže nespecifikovanou chybějící komponentu. Ve formuláři je uveden odkaz vedoucí na návod k instalaci (k ničemu), problém se vyskytuje pravděpodobně jen v x64 verzi.

The action you attempted to perform on a remote instance of SQL
Server has failed because the action requires a SQL Server component
that is not installed on the remote computer. To proceed, install SQL
Server 2005 Management Tools on the remote computer, and then try
again.  For more information, see "How to: Install SQL Server 2005
(Setup)" in SQL Server 2005 Books Online, or find the article on MSDN
at http://go.microsoft.com/fwlink/?LinkID=57083 .
(Microsoft.SqlServer.Management.MaintenancePlanWizard)

For help, click: http://go.microsoft.com/fwlink/?LinkID=57083

Řešení zdá se být jednoduché – stačí nainstalovat Integration services, které onu neznámou komponentu obsahují. SP2 by měl být upraven tak, aby komponenta byla součástí databázového jádra.

Zdroj: Maintenance Plan problem

IIS: Vytvoření žádosti o certifikát na website s existujícím certifikátem

Pokud je potřeba vytvořit žádost, která obsahuje stejná data jako aktuální certifikát, není problém – na IIS se proces prokliká.

Ovšem pokud je v žádosti třeba něco modifikovat (např. se změnil vlastník domény nebo jeho název), je potřeba vygenerovat žádost s novými údaji a to IIS neumí – nabízí pouze certifikát odebrat a to nechceme. Řešení spočívá ve vytvoření dočasné website, ke které žádost vytvoříme, návod je uveden na serveru Thawte pod kódem vs32621.

Zde je kopie textu:

To work around this problem without having to ‚remove‘ the existing certificate from your web site, do the following:

1. In IIS right click the ‚Default Web Site‘ and click on ‚New–>Site‘

2. Create a new site. You can give it a temporary name.

3. Right click on this new site and go to ‚Properties–>Directory Security–>Server certificate‘

4. Select ‚Create a new certificate‘ and follow the wizard to create a new CSR, please refer to the following solution: vs27731

5. Backup the Private Key file – very important, if no backup is made and the Private Key is lost, the certificate issued will not work. The Private Key backup instructions can be found in the following solution vs22515

6. When you receive the certificate back, right click on this temporary site and go to ‚Properties–>Directory
Security–>Server certificate‘ and follow the wizard to ‚process the pending request‘

7. Once the certificate has been installed, right click on the site where the certificate should go and click ‚Properties–>Directory Security–>Server certificate‘

8. Select the option, ‚Replace the current certificate‘

9. You will then be able to select the certificate that you have just installed

10. Once installed we strongly advise you to make a backup of your certificate with its corresponding private key. View Solution vs22528

For more information please see Microsoft’s article at the following link: http://support.microsoft.com/default.aspx?scid=kb;en-us;Q295281

Podivné chování session, přegenerovávání SessionID

V aplikaci je přihlašovací dialog. Zde by měla aplikace vytvořit session a poslat její identifikátor klientovi, což se stane.

Po přihlášení se zobrazí stránka obsahující frames, každý frame (a iframe) však znovu dostává jiný identifikátor session. To je špatné, protože každému frame je potom poslána jiný identifikátor session a tudíž má jeden uživatel více session.

Problém nenastane, pokud do přihlašovacího dialogu umístím kód:

Session["some_key"] = "some_value";
Session.Clear();

Trochu mě překvapuje, že session Session.Clear() je možné provést a je možné mít tedy prázdnou session. ASP.NET tedy pravděpodobně ruší session, pokud s ní nebylo pracováno (nebylo k ní přistoupeno).

Celý problém jsem vyřešil potomkem HttpApplication (Global.asax):

private void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
    // tento kod opravuje podivne chovani Session.
    if (Context.Session != null)
    {
        Context.Session[&quot;__Application_PreRequestHandlerExecute&quot;] = &quot;some_value&quot;;
        Context.Session.Remove(&quot;__Application_PreRequestHandlerExecute&quot;);
    }
}