2012-02-10 3 views
0

다음 코드를 사용하여 Powerpoint Presentation에서 매크로를 만들었습니다. 이 작은 코드를 실행할 때 "시각적 기본 프로젝트에 대한 프로그래밍 방식의 액세스는 신뢰할 수 없습니다"라는 예외가 발생했습니다. 옵션에서 보안 센터 설정을 변경하면이 문제를 해결할 수 있습니다. 그러나 코드를 통해 이러한 설정을 어떻게 바꿀 수 있는지 누군가가 나를 도울 수 있습니까? 어떤 파워 포인트 interop APIs? pl 제안 .. 미리 감사드립니다. 코드를 통해 매크로 설정을 활성화하는 방법은 무엇입니까?

내 샘플 코드 : 결국

PowerPoint.Application oPPT = new PowerPoint.Application(); 
oPPT.Visible = Office.MsoTriState.msoTrue; 

//Add New Presentation 
PowerPoint.Presentations oPresSet = oPPT.Presentations; 
PowerPoint.Presentation oPres = oPresSet.Add(Office.MsoTriState.msoTrue); 

//Add Slides to the Presentation 
PowerPoint.Slides oSlides = oPres.Slides; 
PowerPoint.Slide oSlide = oSlides.Add(1, PowerPoint.PpSlideLayout.ppLayoutTitle); 

VBComponent vbc = oPres.VBProject.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule); 
string code = "sub VBAMacro()\r\n" + "ActivePresentation.Close\n" + "End Sub"; 
vbc.CodeModule.AddFromString(code); 
+0

나는 이것을 할 수 있을지 의심 스럽다. 신뢰할 수없는 코드가 사용자의 허가없이 실행되지 않도록하는 요지는 악성 코드가 실행되지 않도록하는 것입니다. 악의적 인 코드가 사용자에게 먼저 묻지 않고 실행될 수 있다면 전체 목표를 무력화시킬 것입니다. 그렇지 않습니까? –

+0

그 보안 정책에 대한 지식이 거의 없습니다. 그러나 정품 사용자가 자동화 된 방식으로 프레젠테이션에서 매크로를 실행하지 못하도록 제한하지 않습니까? – satya

+0

아니요. 사용자는 옵션을 변경하여 코드가 실행되고 있음을 알 수 있습니다 (언급 한대로). 그러나 코드에서이를 수행하면 코드가 사용자의 동의없이 완료 될 수 있습니다. 이는 코드가 나쁜 일을 할 수 있음을 의미합니다. 사람들은 VBA 매크로에서 항상 맬웨어를 작성하는 데 사용되었습니다. 그것이 보안 설정이 처음부터 확립 된 이유입니다. –

답변

2

가 해당 설정이이 같은 일을 할 수 있도록 단지, 레지스트리 키에 저장되어 있지만 해당 레지스트리 키에 액세스 할 수있는 권한으로 실행해야합니다 . 나는 기본적인 테스트를했고 그것은 내 컴퓨터에서 작동하는 것처럼 보였다.

using (var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Office\14.0\PowerPoint\Security",true)) 
{ 
    int origVal = (int)key.GetValue("AccessVBOM", 0); 
    if (origVal != 1) 
     key.SetValue("AccessVBOM", 1); 


    PowerPoint.Application oPPT = new PowerPoint.Application(); 
    oPPT.Visible = Office.MsoTriState.msoTrue; 

    //Add New Presentation 
    PowerPoint.Presentations oPresSet = oPPT.Presentations; 
    PowerPoint.Presentation oPres = oPresSet.Add(Office.MsoTriState.msoTrue); 

    //Add Slides to the Presentation 
    PowerPoint.Slides oSlides = oPres.Slides; 
    PowerPoint.Slide oSlide = oSlides.Add(1, PowerPoint.PpSlideLayout.ppLayoutTitle); 

    VBComponent vbc = oPres.VBProject.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule); 
    string code = "sub VBAMacro()\r\n" + "ActivePresentation.Close\n" + "End Sub"; 
    vbc.CodeModule.AddFromString(code); 

    if (origVal != 1) 
    { 
     key.SetValue("AccessVBOM", origVal); 
    } 

    key.Close(); 
} 
+0

PPT가 시작되기 전에 코드를 외부에서 실행하고 실행할 수있는 한 설정을 변경할 수 있습니다 (예 : 과정을) 마지막으로 확인한 PPT는 시작할 때 레지스트리 설정을 읽으며 사용자가 UI를 통해 내용을 변경하면 내부적으로 저장되고 즉시 레지스트리에 다시 쓰여지고 전체 작업은 시스템 종료시 다시 기록됩니다. ppt가 열려있는 동안 reg에 무시됩니다. –

+0

PPT는 시작할 때 설정을 읽지 만 제공된 코드 샘플 (새 응용 프로그램 만들기)을 기반으로합니다. –

+1

그래, 정확히 그렇기 때문에 나는 "당신이 예제에서하고있는 것"을 포함시켜야했다.하지만 "잡았다"는 나에게 일어났다. 파워 포인트는 오직 하나의 인스턴스만을 허용한다. 심지어 요청 새로운 파워 포인트 응용 프로그램은 이미 실행중인 PPT 인스턴스에 대한 참조를 제공하므로 레지스트리 설정 작업을 계속하는 경우에 대비하여 조치를 취해야합니다. 재미를 끝내기가 쉽지 않습니다. ;-) –

관련 문제