Pavel Novotný

.NET Framework, Sharepoint, Dynamics CRM, RC Helicopters

Visual Studio 2010–Vypnutí hlášky Attach Security Warning

clock listopadu 25, 2011 08:37 by author Pavel Novotný

Hláška: Attach Security Warning

Popis:  Attaching to this process can potentially harm your computer.  If the information below looks suspicious or you are unsure, do not attach to this process.

image

Postup deaktivace:

  • zavřít všechny instance Visual Studia
  • zkontrolujte, zda jste členem lokální uživatelské skupiny debuggers (Control Panel, Administrative Tools, Local Security Policy, Security Settings, Local Policies, User Rights Assignment, Debug Programs).
    image
  • Pomocí regedit.exe změňte hodnotu klíče HKCU\Software\Microsoft\VisualStudio\10.0\Debugger\DisableAttachSecurityWarning z 0 na 1
  • Spusťte Visual Studio


Error 348: Compilation failed. Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

clock října 10, 2011 14:58 by author Pavel Novotný

Tuto chybu jsem tak nějak nepochopil, zřejmě je to bug ve Visual Studiu 2010. Projekt nelze kompilovat a hlásí to chybu “error 348: Compilation failed. Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.”

Na jediné řešení na které jsem přišel je, že je potřeba otevřít .csproj v poznámkovém bloku a odstranit elementy <ProjectTypeGuids>, následně znovu otevřít projekt.

Zvláštní, ale funguje to.



ILSpy–nová alternativa k již placenému RedGate .NET Reflector

clock března 31, 2011 11:42 by author Pavel Novotný

Společnost RedGate se bohužel rozhodla zpoplatnit asi nejznámější produkt mezi .NET vývojáři, a to produktu .NET Reflector (http://www.reflector.net/).

Tento produkt měl sice spoustu much, ale hodně krát nám pomohl objasnit chování některých nedeterministických funkcí a knihoven, zejména v SharePointu. To co mě mrzí nejvíce není ani samotné zpoplatnění (v celku zanedbatelných 35 USD), ale to že RedGate na tom od převzetí od vývojáře Lutz Roedera  v roce 2008 neudělal vůbec nic! Tedy integraci do menu Visual Studia nepovažuji za pokrok.

    

Naštěstí se objevila další open source alternativa jménem ILSpy: http://wiki.sharpdevelop.net/ilspy.ashx

image

 

Která je až nápadně podobná .NET Reflectoru, takže přechod není tak bolestný Obličej s očima v sloup 

Samotný ILSpy je ale založený na UI WPF, .NET Reflector stále využívá Windows Forms. To ale samozřejmě není z pohledu funkčnosti důležité, hlavní jsou skutečné features:

ILSpy Features

  • Assembly browsing
  • IL Disassembly
  • Decompilation to C#
    • Supports lambdas and 'yield return'
  • Saving of resources
  • Search for types/methods/properties (substring)
  • Hyperlink-based type/method/property navigation
  • Base/Derived types navigation
  • Navigation history
  • BAML to XAML decompiler
  • Save Assembly as C# Project
  • Find usage of field/method
  • Extensibile via plugins (MEF)

 

ILSpy Roadmap

  • Improve the decompiler
    • Add support for object initializers
  • Assembly Lists
  • Improve search performance
  • Debugger
  • Bookmarks
  • Find usage of type/property/event

 

Stránka projektu: http://wiki.sharpdevelop.net/ilspy.ashx

Twitter: http://twitter.com/ilspy



Nelze modifikovat nastavení IIS WAMREG admin Service – nastavení DCOM je zašednuté/disabled na Windows Server 2008 R2

clock listopadu 12, 2010 00:43 by author Pavel Novotný

Problém je v tom, že aktuálně přihlášený uživatel nemá přístup k danému klíči v registrech systému.

Konkrétně jde o klíč v registrech:

HKEY_CLASSES_ROOT\AppID\{61738644-F196-11D0-9953-00C04FD919C1}

Aby jste tedy mohli změnit nastavení konkrétního DCOM objektu, je potřeba provést změnu nastavení v registrech a tento klíč přiřadit vlastníkům ze skupiny Administrators.

Pokud nyní zavřete správu DCOM objektů a znovu otevřete, již bude možné modifikovat nastavení IIS WAMREG admin Service DCOM objektu.



SharePoint Search Crawler indexuje na publishing portálu kompletně celou stránku–jak indexovat pouze obsah bez navigace a ostatních rušivých elementů

clock října 21, 2010 09:57 by author Pavel Novotný

Search Crawler na publishing portálu indexuje vždy kompletní stránku, tak jak dostane HTML, tak ho uloží do své databáze. To je ovšem problém, neboť následně při vyhledávání vyhledává texty i v navigaci webu nebo hlavičce a patičce. Tyto elementy jsou ale ve většině případů pro všechny stránky na portále stejné, uživatel tak dostává nerelevantní výsledky (navíc stále stejné):

image

Neexistuje možnost, jak automaticky donutit Search Server, aby toto chování změnil a například ignoroval stále stejné elementy na stránce, případně jinak pomocí tagu vynechával zvolené oblasti v master page.

Udělal jsem si proto malého pomocníka, který se vloží do masterpage v podobě:

<DevIT:SearchCrawlTrimmedControl runat="server" SearchAccount="MySearchAccount">

<!-- zde vlozte menu, header, footer... vse co chcete skryt pred indexerem –>

</DevIT:SearchCrawlTrimmedControl>

Kde uvnitř ovládacího prvku SearchCrawlTrimmedControl jsou všechny elementy, které chci skrýt před indexerem obsahu. Tato třída pak následně podle přistupujícího účtu skryje nebo zobrazí vybrané elementy.

/// <summary>
/// Ovladaci prvek pro skyti vsech nepotrebnych veci v masterpage pri indexovani - aby se indexoval pouze samotny obsah stranky
/// <DevIT:SearchCrawlTrimmedControl runat="server"> 
/// <!-- zde vlozte menu, header, footer... vse co chcete skryt pred indexerem -->
/// </DevIT:SearchCrawlTrimmedControl>
/// </summary>
public class SearchCrawlTrimmedControl : Control
{
    public string SearchAccount
    {
        get {
            string ret = ViewState["SearchAccount"] as string;
            if (string.IsNullOrEmpty(ret))
                return "spsearch";
            return ret;
        }
        set { ViewState["SearchAccount"] = value; }
    }

    protected override void Render(HtmlTextWriter writer)
    {
        bool render = true;
        SPUser cu = SPContext.Current.Web.CurrentUser;
        if (cu != null)
        {
            if (cu.LoginName.ToLower().EndsWith(SearchAccount))
            {
                render = false;
            }
        }
        if (Context.Request != null && Context.Request.UserAgent != null &&
            Context.Request.UserAgent.ToLower().Contains("robot"))
        {
            render = false;
        }
        if (render)
        {
            base.Render(writer);
        }
        else
        {
        }
    }
}



Zjištění typu platformy Windows 32bit/x64 v C#

clock července 14, 2010 11:00 by author Pavel Novotný

Viděl jsem několik možností jak zjistit o jaký druh platformy se jedná, od absurdní kontroly existence adresáře “Program Files (x86)” (a ještě fixně na disku C), přes kontrolu environment variables, až po docela zajímavou konstrukci

public bool Is64bit() {
    return Marshal.SizeOf(typeof(IntPtr)) == 8;
}

Tuto funkce jsem sice nezkoušel, ale podle mého názoru určitě nebude fungovat pokud změníte target platform v projektu na 32bit a použijete tuto funkci na x64.

Nakonec mi přišlo nejrozumnější volat API funkci Windows (nemusel jsem řešit problém s unsafe assembly):

private enum Platform
{
    X86,
    X64,
    Unknown
}

internal const ushort PROCESSOR_ARCHITECTURE_INTEL = 0;
internal const ushort PROCESSOR_ARCHITECTURE_IA64 = 6;
internal const ushort PROCESSOR_ARCHITECTURE_AMD64 = 9;
internal const ushort PROCESSOR_ARCHITECTURE_UNKNOWN = 0xFFFF;


[StructLayout(LayoutKind.Sequential)]
internal struct SYSTEM_INFO
{
    public ushort wProcessorArchitecture;
    public ushort wReserved;
    public uint dwPageSize;
    public IntPtr lpMinimumApplicationAddress;
    public IntPtr lpMaximumApplicationAddress;
    public UIntPtr dwActiveProcessorMask;
    public uint dwNumberOfProcessors;
    public uint dwProcessorType;
    public uint dwAllocationGranularity;
    public ushort wProcessorLevel;
    public ushort wProcessorRevision;
};

[DllImport("kernel32.dll")]
internal static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo);

private static Platform GetPlatform()
{
    SYSTEM_INFO sysInfo = new SYSTEM_INFO();
    GetNativeSystemInfo(ref sysInfo);

    switch (sysInfo.wProcessorArchitecture)
    {
        case PROCESSOR_ARCHITECTURE_AMD64:
            return Platform.X64;

        case PROCESSOR_ARCHITECTURE_INTEL:
            return Platform.X86;

        default:
            return Platform.Unknown;
    }
}



TFS 2010: No connection could be made because the target machine actively refused it.

clock července 11, 2010 08:54 by author Pavel Novotný

Pokud si nainstalujete Team Foundation Server 2010 a zobrazuje se Vám tato hláška při snaze vygenerovat report: “No connection could be made because the target machine actively refused it.”

Stačí pouze spustit Windows službu “SQL Server Analysis Services”  a nastavit jí spouštění na automatic :)

Snad to někomu ušetří hodiny hledání chyb v nastavení Reporting Services…..



Document ID v SharePointu 2010 (DMS v SharePointu 2010)

clock února 1, 2010 03:56 by author Pavel Novotný

Seznamy/knihovny v produktu SharePoint 2007 obsahují pouze "ID" sloupce, což je celé číslo, které se neustále zvyšuje. Ve skutečném světě však tento identifikátor zdaleka nedostačuje potřebám společnosti a je potřeba využít mnohem sofistikovanějšího systému pro globální určení dokumentu.

Pro tuto potřebu globálně identifikovat dokument v rámci společnosti vzniknul systém Document ID v SharePointu 2010, který otevře dokument nebo soubor dokumentů souvisejících s ID, bez ohledu na umístění dokumentu.

 

Pro aktivaci systému stačí aktivovat feature:

image

 

Po aktivaci této feature Document ID vznikne nové DMSID při vložení nového dokumentu do knihovny zcela automatizovaně podle vstupního schématu DMSID řetězce:

 image

SharePoint 2010 si Document ID pamatuje, je zcela jedno zda tento dokument přesouváte do jiných knihoven nebo adresářů, vždy je možné se k němu snadno dostat pomocí stejné URL adresy, která se po celou dobu životnosti dokumentu nemění.



BlogEngine.NET Extension: nastavení data vytvoření a popisku galerie

clock srpna 10, 2009 14:42 by author Pavel Novotný

O původním rozšíření galerie pro BlogEngine.NET načítané z Sharepointu se dočtete zde:

http://www.pavelnovotny.info/post/BlogEngineNET-Extension-zobrazeni-lightbox-galerie-obrazku-ziskane-z-Sharepointu-(WSS-MOSS).aspx

 

Nyní jsem projekt malinko upravil tak, aby bylo možné uložit ke každé galerii popisek a její datum vytvoření, protože v předchozí verzi se jako datum vytvoření zobrazoval pouze datum vytvoření samotné knihovny, nešlo tedy alespoň trošku intuitivně nastavit zpětný datum.

Nyní je to možné v nastavení knihovny:

image

image

Zde je možné stejně jako přes menu akcí povolit přístup k vybrané galerii, nastavit datum pořízení + víceřádkový popis galerie. Výsledné zobrazení je možné si prohlédnout zde:

http://www.pavelnovotny.info/SharepointExtensions/Gallery.aspx

 

Aktualizovaná verze zdrojových souborů a instalačního balíku je opět zde:

http://www.pavelnovotny.info/public/BlogEngineExtensions.zip



BlogEngine.NET Extension: zobrazení lightbox galerie obrázků získané z Sharepointu (WSS/MOSS)

clock března 11, 2009 12:20 by author Pavel Novotný

Úvodem bych chtěl upozornit, že tento post byl v úplném počátku motivován soutěží MSDN - "Dokážeš to", později při vývoji rozšíření jsem si ale uvědomil, že něco takového jsem vlastně stejně potřeboval a v mém případě /možná trošku už šílenství/, kdy Sharepoint používám i pro domácí účely /výpočty příjmů/nákladů domácnosti, daní, katalogu e-books, diskusím v rámci rodiny, sdílení kontaktů atd), se mi velice hodí, protože mohu takto jednoduše bez opuštění domácího portálu publikovat fotografie na internet = a nejen já, ale i další rodinný příslušníci (ty ale radši mají aktivované schvalovací workflow :). Na různých místech kódu je patrné, že jsem si také připravoval půdu pro publikování dokumentů, to jsem do této verze nestihl = což by ale nemuselo této ukázce možné integrace nijak vadit. Tento post se pokusím napsat tak, aby byl pochopitelný i pro neznalce Sharepointu, ale když tak pište.

O čem je Sharepoint nebudu zdlouhavě popisovat a vypůjčím si z webu MS tento odstavec:

Microsoft Windows SharePoint Services je univerzální technologie, která umožňuje organizacím a obchodním jednotkám všech velikostí zvýšit efektivitu obchodních procesů a zlepšit produktivitu týmů. Díky nástrojům pro spolupráci, které uživatelům umožňují zůstat připojeni i za geografickými hranicemi a hranicemi organizace, poskytuje služba Windows SharePoint Services uživatelům přístup k informacím, které potřebují.

http://www.microsoft.com/cze/office/technologies/sharepointtechnology/highlights.mspx

 

V Sharepointu existují knihovny dokumentů specializované pro galerie obrázků/fotek:

Toto rozšíření načítá z této galerie obrázky přes vlastní webservices, která řeší logiku povolení/zákazu přístupu k této galerii obrázku. U každé galerie je možné externí přístup aktivovat v menu Akce:

Menu je dvoustavové, pokud tedy přístup aktivujete, zobrazí se v menu deaktivace (to je realizováno formou CustomAction ve WebControl):

Po povolení přístupu bude galerie ihned dostupná v BlogEngine.NET:

 

V galerii je, už jak titulek tohoto postu napovídá, implementovaný Lightbox 2:

Pokud aktivujete více galerií, jsou zobrazeny na této stránce všechny, seřazeny podle data vytvoření sestupně.

Jednotlivé galerie lze vkládat i do samotného postu, stačí na to jednoduchý zápis přímo do těla postu (je v obrázku, aby se mi také nepřidala galerie):

Stačí tedy copy&paste relativní url adresy k dané SITE.

Není to hezké? :)

 

Při inline galerii stále platí, že je použit Lightbox stejně jako na stránce zobrazující všechny galerie, galerie také musí být povolena /bez povolení nebude galerie otevřena/.

Klíčové vlastnosti

  • zobrazuje galerie načítané z Sharepointu
  • skutečná adresa WSS portálu není nikde vidět, obrázky načítá speciální handler
  • obrázky mají primitivní cache na straně BlogEngine v handleru (ten provádí i resizing)
  • zobrazují se pouze explicitně povolené galerie, jiné nejsou dostupné
  • pro zobrazení je použit Lightbox 2
  • demo je na tomto webu
  • dávám k tomu i zdrojové kódy :)

Do budoucna bych chtěl přidat i knihovny dokumentů.

Zdrojové kódy

http://www.pavelnovotny.info/public/BlogEngineExtensions.zip

Budete potřebovat Visual Studio 2008 + WSP Builder

Demo

Demo je přímo na tomto webu zde:

http://www.pavelnovotny.info/SharepointExtensions/Gallery.aspx

Ukázka inline galerie je zde:

OFFLINE


Instalace

Nejprve je nutné provést deploy WSP balíčku na Sharepoint server, k tomu jsem připravil dávku "DeploySolutionPackage.cmd", v té je potřeba změnit akorát url adresu.  Po úspěšné instalaci feature je nutné jí aktivovat na úrovní SITE kolekce:

Hotovo! :) Pokud se teď přesunete do jakékoliv galerie, uvidíte v menu akci pro povolení přístupu z BlogEngine.NET:

Následuje instalace rozšíření do BlogEngine.NET, to je opět jednoduché, stačí kompletní obsah <BlogEngineExtension.zip\BlogEngine> zkopírovat do rootu Vaší aplikace BlogEngine.

Po přihlášení do administrace bude v záložce Extensions nové rozšíření:

Před prvním použitím je nutné toto rozšíření ještě nakonfigurovat, do následující stránky je nutné vložit URL adresu SITE Vašeho Sharepoint portálu.

POZOR: uživatelské jméno ani heslo není nutné vyplňovat, pokud aplikace BlogEngine.NET beží pod účtem uživatele, který má do daného webu přístup. Pokud nemá, počítače například nejsou ve stejné doméně, je nutné specifikovat uživatele ručně /toto řešení je vhodné pouze a jen ve vývojovém prostředí, za každou cenu se vyhněte vyplnění hesla na hostingu !!!/.

I v případě, že máte obě aplikace na stejném severu a nemusíte tedy heslo vyplňovat, důrazně doporučuji použít pro pool nového uživatele, tomu povolit přístup pouze do jednoho webu, určeného pouze pro externí obsah, tedy nikoliv použít uživatele, který může přistupovat do všech webů!!! A i v tomto jednom webu nastavit práva uživatele pouze pro čtení! Nezapomeňte však povolit čtení i na skrytém listu pro konfigurace "/Lists/BlogEngineExtensionLists/AllItems.aspx"

V neposlední řadě si do menu skinu přidejte položku pro zobrazení všech galerii:

<li><a href="~/SharepointExtensions/Gallery.aspx" runat="server">Galerie</a></li>

 

Kompletní balík včetně zdrojových kódů je zde:

http://www.pavelnovotny.info/public/BlogEngineExtensions.zip



About the author

avatar

 

Email: novotny@pavelnovotny.info
Telefon: +420 732376206
Skype: pavelnovotny.info
Messenger: novotny@pavelnovotny.info
Web: www.pavelnovotny.info

Month List

Page List

    Sign in