Zobrazují se příspěvky se štítkemDevelop. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemDevelop. Zobrazit všechny příspěvky

středa 20. března 2019

Jak zaregistrovat vlastní event do EventVieweru

  • Expand HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog
  • Find the Application key and create a new key for your application: MyApp
  • In MyApp, right-click the right side window in the blank area and select New > Expandable String Value. This will create a REG_EXPAND_SZ entry. Give it the name EventMessageFile.
  • Double-click the new entry to set a value. For the value, enter: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\EventLogMessages.dll Select OK.
  • Leave the (Default) string value alone with its (value not set) value.
  • Repeat two more times by replacing CurrentControlSet with ControlSet001 and ControlSet002.

pondělí 26. června 2017

Jak smazat obsah databáze bez databáze

Když je potřeba smazat vše z databáze, ale databázi zanechat.

PRINT 'Dropping whole database'
GO

------------------------------------------
-- Drop constraints
------------------------------------------
DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT DISTINCT sql = 'ALTER TABLE ['+tc2.CONSTRAINT_SCHEMA+'].[' + tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + ']'
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME

OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql

WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @Sql
Exec (@Sql)
FETCH NEXT FROM @Cursor INTO @Sql
END

CLOSE @Cursor DEALLOCATE @Cursor
GO


------------------------------------------
-- Drop views
------------------------------------------

DECLARE @sql VARCHAR(MAX) = ''
, @crlf VARCHAR(2) = CHAR(13) + CHAR(10) ;

SELECT @sql = @sql + 'DROP VIEW ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(v.name) +';' + @crlf
FROM sys.views v

PRINT @sql;
EXEC(@sql);
GO
------------------------------------------
-- Drop procs
------------------------------------------
PRINT 'Dropping all procs ...'
GO

DECLARE @sql VARCHAR(MAX) = ''
, @crlf VARCHAR(2) = CHAR(13) + CHAR(10) ;

SELECT @sql = @sql + 'DROP PROC ' + QUOTENAME(SCHEMA_NAME(p.schema_id)) + '.' + QUOTENAME(p.name) +';' + @crlf
FROM [sys].[procedures] p

PRINT @sql;
EXEC(@sql);
GO

------------------------------------------
-- Drop tables
------------------------------------------
PRINT 'Dropping all tables ...'
GO
EXEC sp_MSForEachTable 'DROP TABLE ?'
GO

------------------------------------------
-- Drop sequences
------------------------------------------

PRINT 'Dropping all sequences ...'
GO
DECLARE @DropSeqSql varchar(1024)
DECLARE DropSeqCursor CURSOR FOR
SELECT DISTINCT 'DROP SEQUENCE ' + s.SEQUENCE_SCHEMA + '.' + s.SEQUENCE_NAME
FROM INFORMATION_SCHEMA.SEQUENCES s

OPEN DropSeqCursor

FETCH NEXT FROM DropSeqCursor INTO @DropSeqSql

WHILE ( @@FETCH_STATUS <> -1 )
BEGIN
PRINT @DropSeqSql
EXECUTE( @DropSeqSql )
FETCH NEXT FROM DropSeqCursor INTO @DropSeqSql
END

CLOSE DropSeqCursor
DEALLOCATE DropSeqCursor
GO

------------------------------------------
-- Drop Schemas
------------------------------------------


DECLARE @schemas as varchar(1000) = 'StaticData,Ird,DataImport,Collateral,Report,Cds,CommonTrade,MarketData,TypeCode'
DECLARE @schemasXml as xml = cast((''+replace(@schemas,',' ,'')+'') as xml)

DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT sql = 'DROP SCHEMA ['+schemaName+']' FROM
(SELECT CAST(T.schemaName.query('text()') as VARCHAR(200)) as schemaName FROM @schemasXml.nodes('/schema') T(schemaName)) as X
JOIN information_schema.schemata S on S.schema_name = X.schemaName

OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql

WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @Sql
Exec (@Sql)
FETCH NEXT FROM @Cursor INTO @Sql
END

CLOSE @Cursor DEALLOCATE @Cursor
GO

neděle 12. února 2012

Navigace ve Windows Phone pro ČR

Objevil jsem o víkendu zajímavý Launcher ve Windows Phone, který umožňuje využít navigaci pomocí Bingu. Jedná se o BingMapsDirectionsTask. Všechno bylo ideální včetně odladění v emulátoru. Avšak po spuštění aplikace v reálném zařízení najednou navigace nefungovala. Nejprve jsem si myslel, že je problém při získání aktuální polohy, ale nebylo to tím. Nakonec jsem objevil, že je to omezení Bingu pro určité lokality, kam bohužel patří i naše republika.
Ale existuje řešení. V nastavení stačí definovat pro oblast+jazyk (region+language) u prohlížeč a hledání (browser & search language) místo češtiny angličtinu (nejlépe US). Tím se zapne Bing Vision a při hledání se zobrazí více než jen webová verze Bingu. Bohužel ale při hledání se toho ve výsledcích moc nezobrazí :-/ Třeba to časem Microsoft rozšíří o pro naši republiku. Nezbývá než doufat...

pondělí 24. října 2011

Push notifikace a Encoding

Zrovna jsem se pral s jedním problémem při posílání Push notifikací na telefon s WindowsPhone. Příklad z Microsoft stránek fungoval v pořádku. Jakmile jsem to ale předělal na webovou službu, tak se mi najednou objevovala jedna a ta samá chyba:
MessageBadContent
A remote URL was specified in the tile notification payload and one of the following conditions was not met: 1) It was not http://, 2) the host name exceeded 256 characters, 3) the URL exceeded 2055 characters, 4) the domain was not specified in the allowed domains collection.

Zvláštní bylo, že byla stejná pro Tile i Toast zprávy. Přeci jen v Toast zprávě nejde definovat url adresu, takže špatný typ chyby :-/
Strýček Google mi ale vůbec tentokrát nepomohl. Až náhodou po několika bezesných nocích ;-) jsem si všiml drobného detailu. U testu z MS jsem používal jednoduché texty bez diakritiky, kdežto webová služba se snažila posílat reálná data. A hned byl problém jasný. Při převodu zprávy na byte jsem měl definované výchozí kódování. Bohužel to ale nebylo UTF8, jak jsem tupě předpokládal, ale Windows 1250. Stačilo jen změnit Encoding.Default na Encoding.UTF8 a všechno začalo fungovat tak jak má :-)

úterý 18. ledna 2011

Chybný uživatel při přesunu DB (MS SQL)

Když se přesouvá databáze MS SQL z jednoho serveru na druhý pomocí klasické operace backup -> restore, tak nastává problém s definovanými uživateli databáze, kteří nejsou vytvořeni v systémových tabulkách na novém serveru.
Problémové uživatele lze zjistit pomocí následujícího query:
USE DBname
GO

EXEC sp_change_users_login 'Report'
GO
Vypíše se seznam uživatelů s identifikátory(SID)

Dá se to obejít 2 způsoby:
1) vytvořím uživatele na novém serveru, ale nenapojím ho na databázi. Následně pomocí query:
USE DBName
GO

EXEC sp_change_users_login 'update_one', 'userName', 'userName'
GO
a tím dojde k vytvoření vazby mezi uživatelem a databází.
2) případně jednodušeji pomocí následujícího query:
USE YourDB
GO

EXEC sp_change_users_login 'Auto_Fix', 'userName', NULL, 'password'
GO
které uživatele vytvoří v případě, že není nalezen v systémové databázi a prováže ho s databází.

pátek 3. prosince 2010

Vývoj pro WP7 - seminář

Tento týden jsem se zúčastnil semináře o vývoji aplikací pro Windows Phone 7. Chvilku jsem musel všechny ty informace vstřebat, protože prvotní reakce na některé věci byly u mě dost infarktové ;-) Nejvíc mě dostalo prohlášení od člověka z Microsoftu, když říkal jak je česká pobočka brána v potaz v centrále. Hned jsem si připadal jak člověk s kyjem žijící v jeskyni... škoda mluvit.
Během celého semináře bylo dost často slyšet, jak jsou jednotlivé možnosti inspirované ostatními platformami (iPhone, Android). Neříkám, že je to špatně, ale je to dobře? Např. taková nemožnost multitaskingu pro 3.stranu alá iPhone (dřívější verze) mi přijde dost zcestná a doufám, že to chlapci v Microsoftu přehodnotí. I když se přednášející snažil nás přesvědčit, jak se mu tento přístup líbí, jelikož prý jeho HD2 se často jen tak zamyslí a nic se na něm nedá dělat. Tento stav údajně způsobují aplikace na pozadí, které si žijí svým životem. Jenže jako příklad takovéto aplikace použil klienta pro MS Office Communicator, což je aplikace od Microsoftu. Zvláštní, že by Microsoft neuměl udělat správnou aplikaci pro WM :-D Já bych problém hledal spíš v kvalitě aplikace než v architektuře systému.
Každopádně na mě momentální verze Windows Phone 7 působí jako drahé zařízení s nadupaným HW, které však slouží jen jako terminál pro webové a cloudové aplikace. Toto jen podtrhuje neexistence MS SQL Compact, i když údajně tato databáze je uvnitř systému použita.

Co se mi líbilo
Vývoj je prakticky stejný jako vývoj kterékoliv Silverlight aplikace. Na jednu stranu jednoduché, ale na druhou i omezující.
Už vím, proč některé aplikace po návratu zachovají svůj předchozí obsah a některé ne. Samozřejmě je to opět o vývojářích. V této verzi OS je na vývojáři, jestli uloží aktuální stav aplikace při přechodu na jinou aplikaci a při návratu zase vrátí aplikaci do původního stavu. Existují na to události (OnActivate, OnDeactivate), ve kterých lze stav aplikace uložit buď do paměti a nebo do IsolatedStorage. Výhoda druhého je v persistentním uložení i pro další spuštění aplikace.
Líbí se mi ovládací prvky Pivot a Panorama, které jsou použity v hubech, sice vypadají dost podobně, ale mají trochu jinou logiku použití.

Co nelíbilo
To hlavní je nemožnost ukládání dat do nějaké databáze. V tuto chvíli je jediná možnost, pro persistentní uložení dat, IsolatedStorage, které lze nastavit buď do režimu ukládání key/value nebo file system, kdy lze ukládat xml soubory. No a pak samozřejmě kamkoli mimo WP7.
Momentálně nelze vytvářet záznamy pro jiné aplikace bez toho, aniž by tato aplikace byla spuštěna. Např. potřebuji vytvořit nový úkol automaticky, ale to nejde. Musím zavolat aplikaci, která slouží pro úkoly, a té tyto informace předat. Uživatel pak musí tento záznam uložit sám. Argumenty, že je to tak bezpečnější, neberu. Každopádně je to uživatelsky méně přívětivé. Jelikož uživatel musí stejně při instalaci aplikace souhlasit s tím, že aplikace bude využívat další služby (alá Android).

Ještě k systémovým službám
Údajně jsou nyní 2 možnosti, jak může aplikace v pravidelných intervalech provádět nějakou činnost:
1) aplikace musí být uživatelem vytažena na hlavní obrazovku jako Live Tile a pak může provádět v určité časové periodě něco. Existuje tu ale několik omezení ohledně max. času zpracování a reakce.
2) pomocí push notifikací, které jsou ale taky omezené

Seminář byl velmi povedený, dozvěděl jsem se na něm spousty zajímavých informací. Nejdůležitější byla ta, že zatím čeští vývojáři nemají možnost aplikace umisťovat na market a ani jim Microsoft neumožní odblokovat telefon pro vývoj. Takže nezbývá než čekat, prý do léta příštího roku, kdy by mohl být market vývojářům zpřístupněn. Snad bude pak i přístupný uživatelům v ČR.
Takže uvidíme...

pondělí 15. listopadu 2010

Chyba WCF "An error occurred when verifying security for the message."

Vrátím se ještě k předchozímu příspěvku, kde jsem popisoval UserNamePasswordValidator při ověřování klienta ve WCF službě. Setkal jsem se totiž s jedním problémem při přesunu na testovací server, který mi zabral pár hodin zkoumání.
Nastavil jsem na testovacím serveru vše potřebné včetně certifikátu. Po spuštění klienta jsem ale neustále dostával tu samou nic neříkající chybovou zprávu "An error occurred when verifying security for the message.". Pátral jsem po webu, co by to mohlo být. Zhruba 90% všech nalezených řešení, spojených s touto chybou, se týkalo špatně nastaveného času mezi klientem a serverem - defaultně se toleruje odchylka max. 5 minut, ale dá se pomocí konfigurace WCF změnit nastavením MaxClockSkew. Toto ale nebyl můj případ, jelikož hodiny byli na obou stranách komunikace synchronizované automaticky a nerozcházely se.
Pak jsem narazil na jeden příspěvek, který řešil stejný problém, ale příčina chyby nebyla v čase nýbrž ve velikosti zprávy. To mě přivedlo na myšlenku, že ta chyba může být vlastně libovolná a chybová zpráva neodpovídá skutečné příčině chyby. A měl jsem pravdu. Po chvilce laborování jsem našel špatně nastavené připojení do databáze, takže při ověřování klienta se nepodařilo připojit k SQL serveru a přitom se vygenerovala tato nic neříkající chyba.
Takže jaký je závěr? Dokud není sestaveno spojení, tak nelze věřit plně chybovým zprávám. Vypadá to, že někdy se některé chyby spolknou a k vám se dostane až nějaká další chyba, která při sestavování komunikace vznikla.
I programátoři jsou jen lidé, i když ne každý tomu věří ;-)

středa 3. listopadu 2010

WCF a UserNamePasswordValidator

Laboroval jsem teď nějakou chvíli s ověřováním uživatelů ve WCF. Potřeboval jsem kontrolovat, že uživatel volající metody WCF služby, má právo je využívat. Bohužel jsem byl předem omezen mantinely:
  • credentials uživatelů v MS SQL
  • basicHttpBinding
  • služba hostovaná v IISku
Použitý binding je omezující v tom, že komunikace musí být vždy zabezpečená pomocí certifikátu, bez něj to prostě nejde. Zajímavé je, že to nemusí být na IISku definované jako "required". Ale i když jsem definoval referenci služby bez https, tak se generoval endpoint s https. Je to někde "natvrdo" nastavené a bez https to nefunguje.
Jsou asi jen 2 možnosti, jak ověřovat uživatele:
  • využít ASP.NET providera
  • využít třídu UserNamePasswordValidator
Rozdíl je asi jen v komplexnosti, co od toho očekáváte. Výhoda ASP.NET providera je v tom, že lze použít i návazné role a profily. 
Mě stačilo jednoduché ověření uživatele. Také proto, že jsem měl jinou strukturu DB pro uživatele a tím pádem bych musel psát vlastního ASP.NET providera, jsem se rozhodl pro využití UserNamePasswordValidator. Odvodil jsem si vlastní třídu a přepsal metodu Validate - jednoduchý příklad je v MSDN.
Největší problém byl s konfigurací, aby validátor správně fungoval a nepoužívalo se ověřování Windows. Nastavení WCF služby:

<system.serviceModel>
<services>
<service name="ServiceLibrary.Service" behaviorConfiguration="CoopServiceBehavior">
<!-- Service Endpoints -->
                 <endpoint address="" binding="basicHttpBinding" bindingConfiguration="MyBinding" contract="ServiceLibrary.IService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="MyBinding">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="CoopServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceCredentials>
<serviceCertificate findValue="CN=zeleny5" storeName="CertificateAuthority" x509FindType="FindByIssuerName"/>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="ServiceLibrary.CustomUserNameValidator, ServiceLibrary"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

Na IISku si vygenerujete certifikát, který by měl být podepsaný nějakou certifikační autoritou (CA). Na klientovi musí být certifikát CA nainstalován mezi důvěryhodnými kořenovými certifikačními úřady. Jinak bude při komunikaci vyvolána chyba. Dále je potřeba na serveru udělit práva na čtení k certifikátu. Na adresáři C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys nastavte práva na čtení pro Network Service, pod kterým běží služba v IISku (nastaveno v aplikačním poolu). Může to hlásit chyby typu Access Denied, ale to nevadí, protože to stejně bude fungovat ;-) Na webu, kde poběží služba, je potřeba definovat vazbu na HTTPS s vygenerovaným a podepsaným certifikátem. Není potřeba nastavovat vyžadování SSL.

Když je vše správně nakonfigurované, tak by to mělo fungovat... klient se připojí ke službě, ta ho ověří a dovolí mu vyvolat požadovanou metodu. V opačném případě dojde k chybě - v závislosti na implementaci v metodě Validate.

úterý 21. září 2010

WCF RIA Services - update datového zdroje

Hraju si teď trochu s WCF RIA Services. Vcelku zajímavá technologie, ale má i své nedokonalosti. Jako první a asi i dost podstatná je nemožnost změny datového modelu nějakým hezkým automatickým způsobem ;-)
O co jde? Mám vytvořený databázový model, entity model a domain service. Někdy v průběhu vývoje zjistím, že je potřeba udělat nějaké změny a rozšíření v DB. Není problém udělat update v databázi. Entity model lze také jednoduše upravit (v edmx souboru přes pravé tlačítko myši). Jenže co s domain service? Tady jsem zatím narazil. Žádná automatika není (nebo jo? :-O). Trochu jsem po tom pátrat a našel jsem jen takový work around. Vytvořit nový dočasný domain service pouze pro novou tabulku. Jeho obsah následně přenést do původního domain service a dočasný smazat. Stejným způsobem přenést i informace o metadatech. V případě změny struktury tabulky se to musí udělat podobně, ale stačí jen takto upravit metadata.
Řešení zatím nic moc, snad se dočkáme v další verzi nějakého pokroku v tomto směru. Na druhou stranu ani ta automatika nebude úplně dokonalá, protože v případě doplnění domain service o vlastní metody a nepoužití partial class, by mohlo dojít ke ztrátě těchto metod.

úterý 22. června 2010

Zjištění velikosti jednotlivých tabulek v DB

Dneska jsem potřeboval zjistit velikosti jednotlivých tabulek v databázi. Sice jsem v SQL Manageru našel možnost zobrazení nějakého takového reportu, ale selhalo to na chybě. Kolega mi poskytl zajímavý skriptík, který hezky přehledně zobrazí jednotlivé velikosti tabulek v databázi. Člověk hned zjistí, která z tabulek je ta nenasytná ;-)


DECLARE @DATABASE varchar(100)
DECLARE @tablename varchar(100)
DECLARE @Space TABLE (name varchar(100), rows varchar(100), reserved varchar(100), DATA varchar(100), index_size varchar(100), unused varchar(100))

SET @DATABASE =  DB_NAME()

DECLARE State_Cursor CURSOR FOR
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'   AND TABLE_CATALOG = @DATABASE ORDER BY TABLE_NAME
OPEN State_Cursor
FETCH NEXT FROM State_Cursor INTO @tablename
WHILE @@FETCH_STATUS = 0
BEGIN
  INSERT INTO @Space EXEC sp_spaceused @tablename
  FETCH NEXT FROM State_Cursor INTO @tablename
END
CLOSE State_Cursor
DEALLOCATE State_Cursor

SELECT * FROM @Space

úterý 15. června 2010

Povolení MSDTC se vzdáleným MS SQL

Potřeboval jsem zapnout distribuované transakce mezi vývojovým počítačem a MS SQL databází, která běží na jiném stroji. Chyba ve VS byla celkem jasně popsaná, ale kdyby MS před náma neměl neustále nějaké tajnosti :-/ V XP je to celkem jednoduché. Přes Správu počítače se tam dá dostat. Bohužel u Vist je to jiné. Musí se ručně spustit comexp.msc. Následně se ve stromečku vybere Služba komponent -> Počítače -> Tento počítač -> Koordinátor distribuovaných transakcí -> Místní koordinátor DTC. Na poslední položce zvolit Vlastnosti. Na kartě Zabezpečení nastavit vše dle obrázku.
Tím je první část hotovo, ale ještě není vše vyřešeno ;-) Ještě je potřeba povolit na firewallu patřičný port pro komunikaci. Když se jedná o standardní systémový firewall od MS, tak to lze nastavit následovně. V Ovládacích panelech se vybere Centrum zabezpečení. V levé nabídce zvolit Brána firewall systému Windows. V dalším okně opět zleva vybrat Povolit program v bráně firewall systému Windows. Na záložce Výjimky nejprve Přidat program..., kde pomocí Procházet... se musí vybrat ze systémového adresáře windows - tj. %windir%\system32 - soubor msdtc.exe. Potvrdit a poté Přidat port..., kde se doplní nějaký název - např. MSDTC - nastaví se číslo portu 135 a zvolí protokol TCP. Všechno potvrdit, zavřít a když pánbůh dá (rozuměj Bill Gates ;-)) tak to začne fungovat :-D