Användare kan inte skicka e-postmeddelanden från en mobil enhet eller från en delad postlåda i Exchange 2000 Server och Exchange Server 2003

Artikelöversättning Artikelöversättning
Artikel-id: 912918 - Visa produkter som artikeln gäller.
Visa alla | Dölj alla

På den här sidan

Symptom

När du försöker skicka ett e-postmeddelande i Microsoft Exchange 2000 Server eller Microsoft Exchange Server 2003 går det inte att skicka meddelandet. Dessutom kan något av följande fel- eller NDR-meddelanden (Non Delivery Report) visas.

Felmeddelanden

  • Åtkomst nekad
  • Du har inte rättigheter för att utföra den här åtgärden på objektet. Kontakta kontaktpersonen för mappen eller systemadministratören.
  • Unlisted Message Error
  • MAPI_E_NO_ACCESS -2147024891
  • Failed to submit mail message for user USERNAME (HRESULT:-2147024891) Pausing user USERNAME. (Security error - Cannot access the users mailbox.)
  • Det gick inte att hitta resursen
Obs! Felmeddelandet "Åtkomst nekad" eller "Det gick inte att hitta resursen" visas från Outlook Web Access när du är inloggad som ett ombudskonto.

NDR-meddelanden

  • Du har inte behörighet att skicka till den här mottagaren. Kontakta systemadministratören om du behöver hjälp.
  • Meddelandet kunde inte skickas med din postlåda. Du har inte behörighet att skicka meddelanden från angiven användare.
Problemet gäller följande produkter från andra tillverkare:
  • Research In Motion (RIM) BlackBerry Enterprise Server (BES)
  • Good Technology GoodLink Wireless Messaging
Följande produkter från andra tillverkare påverkas inte av problemet.
  • Cisco Unity Unified Messaging
  • Quest Migration Suite for Exchange
  • Microsofts verktyg ExMerge för Exchange
Problemet kan även påverka anpassade MAPI- eller CDO-baserade (Collaborative Data Objects) program som skickar e-postmeddelanden.

Andra produkter från andra tillverkare som utnyttjar tjänstkonton för att skicka e-postmeddelanden kan också påverkas. Om du använder en produkt från en annan tillverkare som påverkas av det här problemet rekommenderar vi att du kontaktar leverantören för att få hjälp. Se vidare "Mer information".

Viktigt! Som en nödåtgärd för att återställa Send As-funktionen för verksamhetskritiska program kan du ge Send As-behörighet till ett tjänstkonto genom arv via en Active Directory-behållare eller till och med en hel domän. Detaljerade instruktioner finns i nedan. Även om detta är ett effektivt sätt att lösa det omedelbara problemet har det vissa konsekvenser för säkerhet och hantering som bör beaktas. Det kan medföra att Send As-behörigheten ges för konton som inte är avsedda, och du måste beakta Send As-behörigheten om du flyttar användarkonton till en annan behållare.

Orsak

Det här problemet kan uppstå om någon av följande förutsättningar föreligger:
  • Du har inte behörighet att skicka e-postmeddelanden som postlådans ägare på kontot du använder för att skicka e-postmeddelandet.
  • Du använder Microsoft Exchange 2000 Server Service Pack 3 (SP3) med version 6619.4 eller senare av filen Store.exe. Version 6619.4 blev först tillgänglig i följande artikel i Microsoft Knowledge Base:
    915358 Snabbkorrigering för ändring av funktionen hos Full Mailbox Access-behörighet i Exchange 2000 Server
  • Du använder Microsoft Exchange 2003 Server Service Pack 1 (SP1) med version 7233.51 eller senare av filen Store.exe. Version 7233.51 blev först tillgänglig i följande artikel i Microsoft Knowledge Base:
    895949 Ändring av funktionen hos ?Send As?-behörigheten i Exchange 2003
    Observera att den här korrigeringsfilen inte ingår i Microsoft Exchange 2003 Service Pack 2 (SP2). Om du har installerat snabbkorrigeringsversionen för Exchange Server 2003 SP1 måste du installera versionen för Service Pack 2 efter uppgradering till Service Pack 2.
  • Du använder Exchange Server 2003 SP2 med version 7650.23 eller senare av filen Store.exe. Version 7650.23 blev först tillgänglig i följande artikel i Microsoft Knowledge Base:
    895949 Ändring av funktionen hos ?Send As?-behörigheten i Exchange 2003
    Obs! Den här ändringen ingår inte i Exchange 2000 Server SP3, Exchange Server 2003 SP1 eller Exchange 2003 SP2. Ändringen implementerades efter publiceringen av dessa Service Pack-versioner, men stöds i samtliga versioner. Ändringen kommer att ingå i framtida Service Pack-versioner för de här produkterna.

    Om du har installerat Exchange Server 2003 SP2 måste du installera den ytterligare uppdateringen för att den nya funktionen ska kvarstå, även om du redan har installerat uppdateringsversionen för Exchange Server 2003 SP1.

Lösning

Före Store.exe-versionerna i avsnittet "Orsak" innebar Full Mailbox Access-behörighet (Fullständig åtkomst till postlåda) även behörighet att skicka e-post som postlådans ägare. Detta medförde att ett annat konto med Full Mailbox Access-åtkomst till postlådan kunde skicka e-postmeddelanden som verkade komma från postlådans ägare.

Många Microsoft Exchange-kunder har begärt att Send As-behörighet (Skicka som) ska skiljas från Full Mailbox Access-behörighet av följande skäl:
  • För att förhindra utskick av falsk e-post.
  • För att säkerställa att e-postmeddelanden som skickas av ett ombud alltid skiljer sig tydligt från e-postmeddelanden som skickas av postlådans verkliga ägare.
Alla nya versioner av Exchange-informationsarkivet kommer nu explicit att kräva Send As-behörighet om någon vill skicka e-postmeddelanden som postlådans ägare. Det finns emellertid tre undantag till detta krav:
  • Postlådans ägarkonto behöver inte ha explicit Send As-behörighet för sin egen postlåda.
  • Det associerade externa kontot för en postlåda behöver inte ha explicit Send As-behörighet.
  • Ett ombudskonto som också har Full Mailbox Access-behörighet behöver inte ha explicit Send As-behörighet.
Mer information om de här undantagen finns i "Mer information".

Alla andra konton som ges partiell eller fullständig åtkomst till en postlåda måste nu explicit ges Send As-behörighet för postlådans ägarkonto för att kunna skicka e-post som postlådans ägare. Här ingår programtjänstkonton som exempelvis skickar e-postmeddelanden till användare av mobila enheter.

Send As-behörighet måste ges till tjänstkontot på varje användarobjekt som äger en postlåda. Det är inte möjligt att ge Send As-behörighet på en Exchange-server eller ett databasobjekt så att Send As-behörigheten gäller för alla postlådor i databasen.

Detta beror på att Send As-behörighet är en Active Directory-behörighet som gäller för Active Directory-objekten den har angetts för. Om Send As-behörighet ges på ett Exchange-databasobjekt ger det Send As-behörighet för själva databasen. Behörigheten omfattar emellertid inte användarna med Send As-behörighet som har postlådor i databasen.

Obs! Att ge Receive As-behörighet (Ta emot som) på en Exchange-databas är den funktionella motsvarigheten till att ge Full Mailbox Access-behörighet till alla postlådor i databasen. Detta skiljer sig från funktionen hos Send As-behörighet.

I Send As-behörigheten gäller behörigheten bara själva databasobjektet, inte postlådorna i databasen. I Receive As-behörighet ärvs behörigheten av alla postlådor i databasen.

För att förstå skillnaden mellan de båda behörigheterna bättre kan du föreställa dig samtliga postlådor i en databas som mappar i en enda postlåda (postlådan "databas"). Om du har fullständig åtkomst till databasen har du behörighet att komma åt allt innehåll i databasen, inklusive samtliga postlådor.

Send As-behörighet gäller identiteten för ett Active Directory-användarobjekt, inte postlådeinnehåll som lagras i en databas. E-postmeddelanden skickas inte från en viss postlåda eller databas utan från en användare. Användaren kan vara postlådans ägare eller något annat konto med Send As-behörighet.

Så här ger du explicit ett annat konto behörighet att skicka e-post som en postlådas ägare:
  1. Starta Active Directory-hanteringskonsolen Användare och datorer.
  2. Kontrollera att alternativet Advanced Features är markerat på View-menyn. Om alternativet inte är markerat är sidan Security inte synlig för User-kontoobjekt.
  3. Öppna egenskaperna för användarkontot som äger postlådan.
  4. Klicka på fliken Security.
  5. Om kontot inte redan finns med i listan med grupp- eller användarnamn lägger du till kontot som ska ha Send As-behörighet för den här användaren.
  6. I rutan Permissions klickar du på Allow for the ?Send As?-behörighet för lämpligt konto.
  7. Klicka på OK.
  8. Starta om Microsoft Exchange Information Store-tjänsten på den aktuella Exchange-servern.
Obs! Om du inte startar om Microsoft Exchange Information Store uppdateras dess behörighetscache så att de nya behörigheterna börjar gälla enligt värdet som har angetts i följande registerundernyckel:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSExchangeIS\ParametersSystem


Värde: Mailbox Cache Age Limit
Värdetyp: REG_DWORD
Bas: Decimal
Data: Åldersgränsen för postlådans informationscache i minuter.
Standardvärdet för den här registerposten är 120 minuter (två timmar). Om du ändrar registerposten måste du starta om Microsoft Exchange Information Store.

Obs! Om du väljer mycket låga timeout-värden kan det påverka serverns prestanda.

Ge Send As-behörighet för flera konton

I slutet av den här artikeln finns ett exempel på ett skript som söker i en Active Directory-katalogtjänstdomän efter konton med Full Mailbox Access-behörighet men utan Send As-behörighet för en postlåda. Det är dessa egenskaper hos ett tjänst- eller resurskonto som påverkas av säkerhetsändringen. Skriptet kan generera en exportfil som du kan granska, redigera och sedan åter importera för att ge Send As-behörigheten till konton som behöver den.

Du kan också ge Send As-behörighet genom arv till alla användarobjekt i en Active Directory-domän eller behållare. Om du ger Send As-behörighet på det här sättet kan det hända att du ger behörighet för objekt som du inte har avsett. Dessutom kan du förlora behörigheten för objekt som flyttas från behållaren. Därför är detta inte standardmetoden. Om du ändå använder den kan det få konsekvenser för säkerheten som bör övervägas noga innan metoden implementeras.

Så här beviljar du Send As-behörighet för ett enda konto på alla användarkonton i en Active Directory-domän eller -behållare:
  1. Starta Active Directory-hanteringskonsolen Användare och datorer.
  2. Kontrollera att alternativet Advanced Features är markerat på View-menyn. Om alternativet inte är markerat syns inte sidan Security för domän- och behållarobjekt.
  3. Öppna egenskaperna för domänen eller behållaren och klicka på sidan Security.
  4. Klicka på knappen Advanced.
  5. Om kontot som behöver behörighet inte finns med i listan klickar du på Add och väljer sedan kontot. Dubbelklicka annars på kontot för redigering.
  6. Klicka på User Objects i listan Applies Onto.
  7. Ge kontot Send As-behörighet.
  8. Klicka på OK tills du har avslutat och sparat alla ändringar.
Obs! I skriptet som beskrivs i slutet av den här artikeln tas hänsyn till ärvda behörigheter. Om du ger Send As-behörigheten med hjälp av den här metoden blir därför konton som har ärvt Send As-behörigheten osynliga för skriptet. För att senare kunna bearbeta dessa konton med skriptet måste du först ta bort den ärvda Send As-behörigheten.

Särskilda regler för skyddade adminSDHolder-konton

Om du använder skriptet för att ge Send As-behörighet för en postlådeägare som även är domänadministratör, gäller inte Send As-behörigheten. Vi rekommenderar att du inte ger postlådebehörighet till användarkonton som har behörighet som domänadministratörer eller är adminSDHolder-skyddade.

adminSDHolder-objektet är en mall för konton som har breda Active Directory-administratörsrättigheter. För att undvika oönskad behörighetshöjning måste alla konton som skyddas av adminSDHolder-objektet ha åtkomsträttigheter som motsvarar åtkomsträttigheterna som anges på själva adminSDHolder-objektet.

Om du ändrar rättigheterna eller behörigheterna på adminSDHolder-objektet för ett skyddat konto, återställs ändringen genom en bakgrundsaktivitet inom några minuter. Om du till exempel ger Send As-behörighet för ett programtjänstkonto på ett domänadministratörsobjekt, återkallas behörigheten automatiskt av en bakgrundsaktivitet.

Därför kan du inte ge Send As-behörighet för ett konto som skyddas av adminSDHolder-objektet till ett programtjänstkonto, om du inte ändrar själva adminSDHolder-objektet. Om du ändrar adminSDHolder-objektet ändrar det åtkomstbehörigheterna för alla skyddade konton. Ändra inte adminSDHolder-objektet förrän du har analyserat samtliga konsekvenser för säkerheten som ändringen kan medföra.

Så här associerar du en postlåda med ett konto som skyddas av adminSDHolder-objektet:
  1. Starta Active Directory-hanteringskonsolen Användare och datorer.
  2. Kontrollera att alternativet Advanced Features är markerat på View-menyn. Om alternativet inte är markerat är sidan Security inte synlig för User-kontoobjekt.
  3. Skapa ett vanligt användarkonto som ska fungera som postlådans ägare.
  4. Tilldela detta vanliga användarkonto en postlåda på en Exchange-server.
  5. Öppna egenskaperna för den nya postlådans ägarkonto.
  6. Ge Full Mailbox Access-behörighet till det skyddade administratörskontot i rutan Exchange Advanced.
  7. Ge Send As-behörighet till det skyddade administratörskontot på sidan Security.
  8. Stäng egenskaperna för postlådans ägarobjekt genom att klicka på OK.
  9. Högerklicka på postlådans ägarkontoobjekt och klicka sedan på Disable Account (Inaktivera konto) så att kontot inaktiveras för alla inloggningar.
Om du vill veta mer om adminSDHolder-skyddade konton klickar du på följande artikelnummer och läser artiklarna i Microsoft Knowledge Base:
907434 "Send As"-behörigheten tas bort från ett användarobjekt efter konfigurering av "Send As"-behörigheten i snapin-modulen Active Directory - användare och datorer (Länken kan leda till en webbplats som är helt eller delvis på engelska)
318180 AdminSDHolder-tråden påverkar transitiva medlemmar i distributionsgrupper (Länken kan leda till en webbplats som är helt eller delvis på engelska)
817433 Delegerade behörigheter är inte tillgängliga och arv inaktiveras automatiskt (Länken kan leda till en webbplats som är helt eller delvis på engelska)
306398 AdminSDHolder-objektet påverkar delegering av kontroll för tidigare administratörskonton (Länken kan leda till en webbplats som är helt eller delvis på engelska)

Särskilda uppgifter för BlackBerry Enterprise Server

Uppgift 1: Se till att BlackBerry Enterprise Server körs som ett separat, unikt konto

Se till att BlackBerry Enterprise Server körs som ett separat konto som är avsett för administrativa uppgifter. Det här kontot kallas som standard "BESAdmin".

Om du har ett separat konto för administration av BlackBerry Enterprise Server går du till uppgift 2.

Om du inte har något separat konto skapar du ett och använder det sedan för att utföra administrativa uppgifter. Instruktioner finns på BlackBerry-webbplatsen för din version av BlackBerry Enterprise Server.

Om du kör BlackBerry Enterprise Server 4.0 eller BlackBerry Enterprise Server 4.1 besöker du följande BlackBerry-webbplats:
http://www.blackberry.com/btsc/search.do?cmd=displayKC&docType=kc&externalId=9174704&sliceId=&dialogID=11024244&stateId=1 0 11020632
Om du använder BlackBerry Enterprise Server 3.6 besöker du följande BlackBerry-webbplats:
http://www.blackberry.com/btsc/search.do?cmd=displayKC&docType=kc&externalId=KB04334&sliceId=SAL_Public&dialogID=11016727&stateId=1 0 11020358

Uppgift 2: Se till att BlackBerry Enterprise Server-tjänstkontot har rätt behörigheter

Kontrollera att BlackBerry Enterprise Server-tjänstkontot har rätt behörigheter.

Obs! Om kontot finns i en domän ser du till att det bara är medlem av gruppen Domänanvändare. På en domänkontrollant ska kontot vara medlem av den inbyggda gruppen Administratörer.
  1. Gör så här i BlackBerry Enterprise Server:
    1. Se till att kontot är medlem av gruppen Local Administrators.
    2. Tilldela kontot behörigheterna "Log on Locally" och "Log on as a Service".
  2. Ge Exchange View-Only Administrator-behörigheter på administratörsgruppsnivå så här:
    1. Högerklicka på det första Exchange Server-administratörsgruppsnamnet i Exchange System Manager, och klicka sedan på Delegate Control.
    2. Observera att BlackBerry Enterprise Server-tjänstkontot uppges ha rollen Exchange View-Only Administrator.
  3. Ge "Send As"-, "Receive As"- och "Administer Information Store"-behörigheter på servernivå för varje Exchange Server-server så här:
    1. Högerklicka på det första Exchange Server-administratörsgruppsnamnet i Exchange System Manager, och expandera sedan gruppen Servers.
    2. Högerklicka på en Exchange Server-server, klicka på Properties och klicka på Security.
    3. Markera BlackBerry Enterprise Server-tjänstkontot i den översta rutan. Se till att behörigheterna "Send As", "Receive As" och "Administer Information Store" har värdet Allow i den nedersta rutan.
    4. Upprepa steg 3b och 3c för varje Exchange Server-server.
  4. Ge postlådearkivet "Send As"-, "Receive As"- och "Administer Information Store"-behörigheter så här:
    1. Högerklicka på det första Exchange-administratörsgruppsnamnet i Exchange System Manager, och expandera sedan gruppen Servers.
    2. Expandera den första postlådearkivgruppen, högerklicka på varje postlådearkiv, klicka på Properties och klicka sedan på Security.
    3. Markera BlackBerry Enterprise Server-tjänstkontot i den översta rutan. Se till att behörigheterna "Send As", "Receive As" och "Administer Information Store" har värdet Allow i den nedersta rutan.
    4. Upprepa steg 4b och 4c för varje postlådearkiv på varje Exchange Server-server.
  5. Gör följande i Active Directory-snapin-modulen Användare och datorer:
    1. Högerklicka på användaren du vill lägga till behörigheter för och klicka sedan på Properties.
    2. Lägg till BlackBerry Enterprise Server-tjänstkontot på fliken Security, och markera sedan kryssrutan Send As.
Om du inte kör Exchange Server 2003 går du till uppgift 3.

Uppgift 3: Rensa cachen på BlackBerry Enterprise Server

Rensa behörighetscachen i informationsarkivet genom att starta om de Blackberry-relaterade tjänsterna och starta om Microsoft Exchange-informationsarkivet. När du har startat om informationsarkivet måste du starta om de RIM Blackberry-relaterade tjänsterna för att ge ?BESAdmin?-kontot den nya Skicka som-behörigheten i Exchange-informationsarkivet.

Mer information om Blackberry-serverkrav finns på följande BlackBerry-webbplats:
http://www.blackberry.com/btsc/search.do?cmd=displayKC&docType=kc&externalId=KB04707&sliceId=SAL_Public&dialogID=3016166&stateId=0%200%202441763

Mer Information

Exchange-behörigheter för åtkomst till postlådor och mappar är uppdelade på Active Directory- och Microsoft Exchange-databaser. Båda behörighetstyperna anges i Active Directory-användarhanteringskonsolen, men olika behörigheter lagras på två olika platser.

Om en behörighet anges på Security-sidan för ett objekt är behörigheten i allmänhet en Active Directory-behörighet. Om behörigheten anges på sidan Exchange Advanced Mailbox Rights är den en Exchange-databasbehörighet. Därför visas följande felmeddelande om du försöker komma åt sidan Mailbox Rights när en användares databas inte är tillgänglig:
The Microsoft Information Store service is unavailable. (Tjänsten Microsoft Information Store är inte tillgänglig.)
Associated External Account-behörigheten är ett undantag till regeln om att behörigheter som anges genom Exchange Advanced Mailbox-rättigheterna lagras i Exchange-databasen. Associated External Account-behörigheten är inte ens en äkta behörighet utan ett sätt att ange Active Directory-attributet msExchMasterAccountSID. msExchMasterAccountSID-attributet är visserligen inte i sig en behörighet, men styr funktionen hos andra behörigheter. Mer information om msExchMasterAccountSID-attributet finns i avsnittet "Associerade externa konton".

Obs! Active Directory-attributet msExchMailboxSecurityDescriptor är en säkerhetskopia av en delmängd av gällande postlåderättigheter. Den används internt i Exchange för en rad olika syften. Dessutom uppdateras attributet msExchMailboxSecurityDescriptor så att det stämmer överens med aktuella gällande rättigheter om administratörer använder gränssnitt som stöds för att tilldela rättigheter.

Om attributet msExchMailboxSecurityDescriptor ändras direkt av en administratör sprids ändringarna emellertid inte till informationsarkivet i Exchange och börjar inte gälla. Synkronisering med aktuella postlåderättigheter garanteras inte. Du bör inte använda attributet msExchMailboxSecurityDescriptor för att läsa eller skriva postlåderättigheter.

Om du vill veta mer klickar du på följande artikelnummer och läser artikeln i Microsoft Knowledge Base:
310866 Ange postlåderättigheter i Exchange Server 2003 och Exchange 2000 Server för en postlåda i informationsarkivet (Länken kan leda till en webbplats som är helt eller delvis på engelska)

Full Mailbox Access-behörighet är en behörighet för Exchange-databasarkivet. Send As-behörighet är en Active Directory-behörighet. Före ändringarna av Exchange-filen Store.exe som beskrivs i den här artikeln gjordes ingen kontroll i Exchange-systemet av inställningen för Send As-behörighet, om avsändaren redan hade Full Mailbox Access-behörighet.

Obs! Du kan ge Send As-behörighet utan att ge Full Mailbox Access-behörighet. I de här situationerna har Send As-behörigheten alltid kontrollerats i Exchange.

Genom att Send As-behörigheten har ingått i Full Mailbox Access-behörigheten har Exchange-serveradministratörer kunnat ge sig själva gällande Send As-behörigheter för alla postlådor på en server de administrerar. De kan göra detta därför att administratörer har fullständig kontroll över Exchange-databaser. Genom att Send As-behörigheten skiljs från Full Mailbox Access-behörigheten kan Active Directory-administratörer nu blockera den här processen, eftersom Send As-behörigheten är en Active Directory-behörighet, inte en behörighet för Exchange-arkivet. Därför står processen inte nödvändigtvis under Exchange-administratörers kontroll.

Postlådeägare

En postlådeägare definieras som Active Directory-användarkontot vars msExchMailboxGUID-attribut innehåller GUID:en (Globally Unique numeric Identifier) för en viss postlåda. Endast ett konto i en hel skog får innehålla GUID:en för en viss postlåda. Om du försöker ge en annan användare samma GUID avvisas ändringen av Active Directory med ett felmeddelande.

När du aktiverar en postlåda för ett konto eller ansluter en frånkopplad postlåda till ett Active Directory-konto, anges postlådans GUID automatiskt för kontot. Det är sällan nödvändigt eller lämpligt för administratörer att ange GUID:er för postlådor direkt.

Associerade externa konton

En vanlig Exchange-konfiguration innebär att Exchange installeras i en resursskog. En resursskog är en skog som finns i en annan skog än användarkontona som kommer att ha postlådor i systemet. Detta utgör ett problem, eftersom msExchMailboxGUID-attributet bara kan anges för objekt som finns i samma skog som Exchange-servern.

Lösningen på det här problemet är att ge ett konto i Exchange-serverskogen postlådefunktion. Sedan kan du länka kontot med postlådefunktion till ett konto i en annan skog eller i en Microsoft Windows NT 4-domän. Du kan göra detta genom att ge Associated External Account-behörighet. Associated External Account-behörighet kan bara ges till ett enda konto, och detta måste komma från en annan skog.

När du anger Associated External Account-behörigheten skriver du SID-värdet för det externa kontot till postlådeägarens msExchMasterAccountSID-attribut. Därför är detta inte någon behörighet utan ett bekvämt sätt att reglera värdet för msExchMasterAccountSID-attributet. När msExchMasterAccountSID-attributet har angetts ges det externa kontot som äger SID:en Exchange-åtkomst som om det var det verkliga ägarkontot för postlådan.

Observera att detta endast gäller Exchange-åtkomst, inte all Active Directory-åtkomst. Dessutom bör du markera ägarkontot för postlådan som Disabled for logons (Inaktiverat för inloggningar) när du har angett Associated External Account-behörighet, så att alla behörigheter fungerar som förväntat.
300456 Klientbehörigheter och delegeringar som har tilldelats i Exchange 2000 kvarstår inte (Länken kan leda till en webbplats som är helt eller delvis på engelska)

Delegeringsscenarier

Ett ombud är en användare som har fått partiell åtkomst till en annan postlåda och rätt att skicka e-postmeddelanden för postlådeägarens räkning. Ett vanligt delegeringsscenario är att en sekretare får ombudsåtkomst till chefens kalender. Ombudet kan vanligen läsa och uppdatera kalendern samt besvara e-postmeddelanden för chefens räkning.

Ombudsåtkomst ges genom att ombudet läggs till i flervärdesattributet publicDelegates för postlådeägaren. Alla användare i det här attributet har Send on Behalf Of-behörighet för postlådans ägare. När sådana ombud skickar ett e-postmeddelande med ägarens namn i rutan Från visas följande värde i rutan Från för e-postmeddelandet:
<Ombudets namn> för <postlådans ägare>
E-postmeddelandet skickas emellertid från ombudet och inte från eller som postlådans ägare.

Följande två gränssnitt kan användas för att ge Send on Behalf Of- och ombudsbehörigheter:
  • Ge Send on Behalf-behörighet på ägarobjektet för postlådan i dialogrutan Exchange General (Allmänt Exchange).
  • Använd dialogrutan Ombud i Microsoft Outlook.
publicDelegates-attributet anges med båda dessa metoder. Outlook-metoden ger emellertid också möjlighet att ge ombudet särskilda mappbehörigheter. Du kan också ge ett ombud behörigheter direkt från egenskaperna för en enskild mapp i Outlook.

I vissa fall går det kanske inte att ange publicDelegates-attributet i Outlook.
329622 Användare tilldelas inte "Send on behalf"-behörighet efter delegering av åtkomst i Outlook (Länken kan leda till en webbplats som är helt eller delvis på engelska)

Om du ger ombudsåtkomst till din postlåda kan ombudet använda Send On Behalf-behörighet även om du inte ger åtkomst till någon av dina postlådemappar. Send on Behalf Of-behörigheten är ombudets grundläggande behörighet. Behörigheter att komma åt postlådemappar är särskilda behörigheter som måste ges utöver delegeringsbehörigheter.

Normalt använder ombud Microsoft Outlook för att komma åt enskilda mappar de har fått behörighet för. De kan göra detta genom att klicka på ÖppnaArkiv-menyn i Outlook och sedan på Andra användares mappar.

Alternativt kan ombud öppna din postlåda genom att ange den som en ytterligare postlåda på fliken Avancerat i sina Outlook-profiler. På så sätt visas din postlåda i ombudets Outlook-mappträd. Dessutom ger den här metoden åtkomst till alla mappar i din postlåda som ett ombud har fått behörighet för.

Om du vill att ditt ombud ibland ska ha Send on Behalf-behörighet och ibland Send As-behörighet gör du så här:
  • Ge ombudet Full Mailbox Access-behörighet. Detta kan inte göras via Outlook, utan en Active Directory-administratör måste göra det på postlådans ägarkonto. Även om du ger ägarbehörighet för varje mapp i Inkorgen är det inte samma behörighet som Full Mailbox Access-behörighet.
  • Ge inte ombudet Send As-behörighet. Om du gör det skickas ombudets alla meddelanden med Send As-behörighet, och ombudet kommer inte längre att kunna använda Send on Behalf Of-behörighet.
I det här fallet ska ombud som vill använda Send on Behalf Of-behörighet logga in på sina postlådor. Om ombuden besvarar eller vidarebefordrar ett e-postmeddelande som redan finns i någon av dina mappar skickas e-postmeddelandet automatiskt för din räkning. Om ombuden skapar ett nytt e-postmeddelande för din räkning måste de ange ditt namn i rutan Från om e-postmeddelandet ska skickas för din räkning.

Oberoende av om ombuden har öppnat dina mappar eller hela din postlåda som en sekundär postlåda, kommer alla e-postmeddelanden som de skickar från dig att ha Send on Behalf Of-behörighet så länge deras egen postlåda är primär postlåda för den aktuella Outlook-profilen.

När ombud vill skicka ett e-postmeddelande som dig ska de logga in i din postlåda med en separat Outlook-profil som bara öppnar din postlåda. E-postmeddelanden som ombuden skickar medan de är inloggade i denna profil skickas automatiskt från dig.

Hitta konton som har Full Mailbox Access-behörighet men inte Send As-behörighet

Skriptexemplet i det här avsnittet kan användas för att söka igenom en Active Directory-domän i taget för att hitta användarkonton där Full Mailbox Access-behörighet har getts till en postlåda som saknar Send As-behörighet.

Viktigt! Innan du ändrar några behörigheter bör du läsa avsnittet Om postlådeägare med ombud.

Skriptet har följande tre lägen:
  • Export: Du kan ta fram en lista med användare som har Full Mailbox Access-behörighet men saknar Send As-behörighet. Sedan kan du granska listan i Anteckningar eller någon annan redigerare och ta bort alla konton som inte ska ha Send As-behörighet.
  • Import: Du kan importera en lista med användare som har Full Mailbox Access-behörighet och som även bör ha Skicka som-behörighet. Observera att du inte kan använda det här skriptet för att ge både Full Mailbox Access- och Send As-behörighet. Ett konto måste redan ha Full Mailbox Access-behörighet för att få Send As-behörighet.
  • SetAll: Du kan ge Send As-behörighet till alla användare i domänen som redan har Full Mailbox Access-behörighet för en viss postlåda. En loggfil genereras i samma format som Export-filen. Detta är samma sak som att köra Export- och Import-lägena utan att redigera Export-filen.
Obs! Det finns ingen Ångra-funktion i det här skriptet.

Behörigheter som krävs för skriptet

Du måste köra skriptet medan du är inloggad på ett administratörskonto från samma skog som kontona som äger postlådor. Skriptet fungerar kanske inte för ett konto med administratörsbehörighet för mer än en skog. Skriptet fungerar kanske inte heller när det körs från en arbetsstation som är ansluten till en annan skog än skogen som postlådans ägarkonton är anslutna till.

Under dessa förutsättningar kan du köra skriptet med flera administratörskonton i en enda inloggningssession med hjälp av kommandot RunAs.exe. Den här proceduren kan vara användbar om du har segmenterade Active Directory- och Exchange Server-behörigheter och du inte har ett enskilt konto som kan administrera alla Exchange-servrar eller alla Active Directory-domäner. Du kan öppna en kommandotolk för att köra skriptet som varje enskilt administratörskonto. Tänk dig följande exempel:
RunAs.exe /användare:domän\konto CMD.EXE
Obs!Du bör inte köra flera kopior av skriptet samtidigt mot samma domän.

I Export-filen finns följande fält, som beskrivs i samma ordning som de presenteras i filen:
  • Display name of the mailbox owner account (Visningsnamn för postlådans ägarkonto)

    Det kan finnas mer än en rad i utdatafilen med samma postlådeägare. Detta inträffar om flera andra konton har Full Mailbox Access-behörighet för samma postlåda.
  • Domain and logon name of an account that has the Full Mailbox Access permissions but not the Send As permission (Domän- och inloggningsnamn för ett konto som har Full Mailbox Access- men inte Send As-behörighet)

    Samma konto kan förekomma flera gånger i Export-filen om kontot har åtkomst till flera postlådor. Detta är oftast fallet för ett programtjänstkonto eller en person som hanterar flera resurspostlådor.
  • Display Name of an account that has the Full Mailbox Access permission but not the Send As permission (Visningsnamn för ett konto som har Full Mailbox Access- men inte Send As-behörighet)

    Tillsammans med fältet Logon Name (Inloggningsnamn) gör det här fältet att kontot lättare kan identifieras.
  • Delegate Status of the mailbox owner (Ombudsstatus för postlådeägaren)

    Om postlådeägaren har ombud är fältvärdet Has Delegates (Har ombud). Om postlådeägaren inte har några ombud är fältvärdet No Delegates (Inga ombud).
  • Enabled or disabled status of the mailbox owner account (Aktiverad eller inaktiverad status för postlådans ägarkonto)

    Det här fältet är användbart vid identifiering av resurspostlådekonton eller postlådekonton för mer än en skog. Dessa konton är normalt inaktiverade.
  • Full Distinguished Name of the mailbox owner account (Det fullständiga unika namnet på postlådans ägarkonto)

    Det här fältet är användbart för att identifiera domän och behållare för postlådans ägarkonto.
  • Full Distinguished Name of the mailbox owner?s mailbox database (Det fullständiga unika namnet på postlådeägarens postlådedatabas)

    I det här fältet ingår databasen, lagringsgruppen, servern och administratörsgruppen för postlådan.
I följande exempel har användaren med inloggningsnamnet "NoSendAs" Full Mailbox Access-behörighet, men inte Send As-behörighet för "Mailbox Owner"-postlådan:
"""Mailbox Owner""" """Domain\NoSendAs""" """No Send As User""" """Has Delegates""" """Enabled""" [ytterligare fält uteslutna]

Administratörsarbetsstationens konfiguration för skriptet

I det här skriptet används Exchange-hanteringsgränssnitt för kommunikation med Exchange-servrar. Därför måste skriptet köras från en Exchange-server eller från en arbetsstation med Exchange System Administrator.

Redigera Export-filen

Exportfilen formateras som oformaterad Unicode-text så att teckenuppsättningar från flera språk kan användas. I vissa textredigerare visas eller redigeras inte filen på rätt sätt eller sparas som ANSI- eller ASCII-text. Unicode-textfiler hanteras på rätt sätt i Anteckningar för Microsoft Windows XP, Microsoft Windows 2000 och Microsoft Windows 2003 samt i Microsoft Excel.

Utdatafilen är i tabbavgränsat format med tredubbla citattecken runt värdena för varje fält. De tredubbla citattecknen används för att import och export från Excel ska bli entydigare. I Excel blir de tredubbla citattecknen enkla och sedan åter tredubbla när filen sparas igen som Unicode-text. Nedan beskrivs hur du öppnar och sparar en Export-fil i Excel på rätt sätt.

Dessutom kan du filtrera en exportfil utan att använda Excel med Find.exe eller Findstr.exe. Dessa verktyg ingår i Windows De gör det möjligt att söka efter ord i en fil och ta fram rader med respektive utan orden. Om du till exempel vill skapa en lista över samtliga postlådeägare med ombud i filen använder du något av de här kommandona för att skapa en fil med endast rader som innehåller strängen ?Has Delegates?:
Find.exe ?Has Delegates? OriginalFile.txt > HasDelegates.txt

Findstr.exe /C:?Has Delegates? OriginalFile.txt > HasDelegates.txt
Låt oss som ett annat exempel anta att du filtrerar bort alla postlådeägare med ombud. Med växeln /V får du fram alla rader som inte matchar sökorden. Du kan använda vilket som helst av de här kommandona för att generera en fil utan några rader med ?Has Delegates?:
Find.exe ?No Delegates? OriginalFile.txt > NoDelegates.txt

Find.exe /V ?Has Delegates? OriginalFile.txt > NoDelegates.txt

Findstr.exe /C:?No Delegates? OriginalFile.txt > NoDelegates.txt

Findstr.exe /V /C:?Has Delegates? OriginalFile.txt > NoDelegates.txt
Du kan också använda kommandona för att generera en fil med en lista över alla konton där ett programtjänstkonto har Full Mailbox Access-behörighet men inte Send As-behörighet. Växeln /I gör kommandot skiftlägesokänsligt:
Find.exe /I ?domän\ServiceAccount? OriginalFile.txt > ServiceAccount.txt

Findstr.exe /I /C:?domän\ServiceAccount? OriginalFile.txt > ServiceAccount.txt
Obs! Om du använder Find.exe för att generera en filtrerad fil måste du ta bort huvudraderna som skapas av Find.exe högst upp i filen.

Använd inte filnamn med jokertecken (*.*) med Findstr.exe. Om du använder jokertecken föregås varje rad i utdatafilen av filnamnet. Du bör granska utdatafilen noga efter filtrering med Find.exe eller Findstr.exe för att kontrollera att du har fått med eller uteslutit avsedda konton.

I följande exempel har användaren med inloggningsnamnet "NoSendAs" Full Mailbox Access-behörighet, men inte Send As-behörighet för "Mailbox Owner"-postlådan.
"""Mailbox Owner""" """Domain\NoSendAs""" """No Send As User""" """Has Delegates""" """Enabled""" [ytterligare fält uteslutna]  

Om postlådeägare med ombud

Ett ombud med Full Mailbox Access (även kallat "superombud") bör vanligen inte ges Send As-behörighet. När superombudet loggar in direkt på postlådeägarens postlåda kan ombudet använda Send As. När ombudet använder delegeringsfunktionerna i Outlook (Öppna följande postlådor eller Öppna andra användares mappar) skickas meddelanden För.

Ge superombud Send As-behörighet endast om du vill att ombudet alltid ska använda Send As som postlådans ägare och aldrig Skicka för postlådans ägare. Vi rekommenderar att du söker efter texten "Has Delegates" i exportfilen och sedan tar reda på om något av superombuden i listan i själva verket är ombud för postlådeägaren.

Endast superombud anges i exportfilen. Vanliga ombud har inte Full Mailbox Access-behörighet. När du ger Send As-behörighet till ett vanligt ombud använder ombudet alltid Send As som postlådeägare. Detta gäller även om det vanliga ombudet inte har Full Mailbox Access. Om du av misstag ger Send As-behörighet till ett ombud kan du enkelt återkalla behörigheten senare.

Öppna en Export-fil i Excel

  1. Starta Excel innan du öppnar Export-filen.
  2. Öppna filen i Excel som en fil av typen Textfiler. Textimportguiden startas.
  3. Ändra eller acceptera följande inställningar i Textimportguiden:
    • Ursprunglig datatyp: Avgränsade fält
    • Börja importera från rad: 1
    • Filursprung: Unicode (UTF-8)
    • Avgränsare: Tab only
    • Ignorera upprepade avgränsare: omarkerat
    • Textavgränsare: " (dubbla citattecken)

Så här sparar du en Export-fil efter redigering i Excel

  1. Klicka på Spara som i Export-filen.
  2. Ge filen ett annat namn så att du har kvar en oredigerad kopia av ursprungsfilen.
  3. Klicka på Arkiv, Spara som, ange ett filnamn som utdata ska sparas under och välj Unicode-text i listrutan Filformat.

Skriptsyntax

Detta är ett textlägesskript och ska köras i ett kommandofönster, inte från dialogrutan Kör. Så här öppnar du ett kommandofönster: klicka på Start, Kör, skriv CMD i rutan Öppna och klicka sedan på OK.

Fellogg- och Export-filer sparas i den aktuella kommandotolkkatalogen. Du måste ha behörighet för att skapa filer i den här katalogen.
Om du vill ha hjälp med kommandoraden skriver du följande kommando:
CSCRIPT AddSendAs.vbs
Om du vill exportera användare som har Full Mailbox Access-behörighet utan Send As-behörighet för en domän skriver du följande kommando:
CSCRIPT AddSendAs.vbs [namn på domänkontrollanten] ?Exportexempel: CSCRIPT AddSendAs.vbs CORP-DC-1 ?Export
Exportfilen genereras som "Send_As_Export_H_MM_SS.txt".
Skriv följande kommando om du vill importera en redigerad Export-fil:
CSCRIPT AddSendAs.vbs [namn på domänkontrollanten] ?Import [filnamn]


Ett exempel:


CSCRIPT AddSendAs.vbs CORP-DC-1 ?Import "Send_As_Export_H_MM_SS.txt"

Ge Send As-behörighet för varje postlåda i domänen till alla användare som redan har Full Mailbox Access-behörighet för en postlåda

Obs! Om du har ombud som även har Full Mailbox Access-behörighet i organisationen ska du inte använda SetAll-läget. Om du gör det i den här situationen får ombuden Send As-behörighet. Detta kan medföra att alla e-postmeddelanden som ombuden skickar får Sent As-behörighet i stället för Sent on Behalf Of-behörighet. Du kan rätta till detta genom att ta bort Send As-behörigheten som ombudet fick av misstag.
CSCRIPT AddSendAs.vbs [namn på domänkontrollant] ?SetAll


Ett exempel:


CSCRIPT AddSendAs.vbs CORP-DC-1 ?SetAll
Om du använder SetAll-läget genereras en exportfil som Send_As_Export_H_MM_SS.txt. Du bör spara denna fil eftersom den visar vilka konton som har ändrats. Om du skulle köra skriptet igen skulle det inte resultera i samma lista med konton, eftersom kontona redan skulle ha fått Send As-behörighet.

Fel som uppstår vid körning av skriptet sparas i filen Send_As_Errors_H_MM_SS.txt. Felfilens namn motsvarar tidsstämpeln timmar_minuter_sekunder från en associerad exportfil.

Skriptändringar

Det kan finnas konton i organisationen som har behörigheter för många objekt och där du inte vill ändra behörigheterna. Du kan minska exportfilens storlek genom att filtrera kontona. Detta gör du genom att ändra variabeln FMA_EXCLUSIVE_LIST i början av skriptet. I listan som skapas med den här variabeln ingår som standard några konton som inte bör visas i utdata från skriptet. Du kan lägga till fler konton med hjälp av följande format:
& "<Domän\Namn>" & OUTPUT_DELIMITER
Du kan exempelvis ändra värdet av variabeln
FMA_EXCLUSIVE_LIST = OUTPUT_DELIMITER & "NT AUTHORITY\SELF" & OUTPUT_DELIMITER & "NT AUTHORITY\SYSTEM" & OUTPUT_DELIMITER
till
FMA_EXCLUSIVE_LIST = OUTPUT_DELIMITER & "NT AUTHORITY\SELF" & OUTPUT_DELIMITER & "NT AUTHORITY\SYSTEM" & OUTPUT_DELIMITER & "Mydomain\Service1" & OUTPUT DELIMITER
Den här ändringen medför att kontot "Mydomain\Service1" inte visas i exportfilen, och inte heller "NT AUTHORITY\SELF" och "NT AUTHORITY\SYSTEM". Observera att värdet Domän\Namn är skiftlägeskänsligt och måste visas exakt som det visas eller skulle visats i exportfilen.

Det finns ytterligare en redigerbar variabel, FMA_EXCLUSIVE_EXSVC, med standardvärdet "\Exchange Services" & OUTPUT_DELIMITER. "Exchange Services" är namnet på ett konto som ges behörigheter via Active Directory Connector i scenarier för migration och existens sida vid sida i Exchange 5.5 och Exchange 2000. Det här kontot skapas i flera domäner och kan visas upprepade gånger i exportfilen om det inte utelämnas.

Bara ett konto kan användas som värde för variabeln FMA_EXCLUSIVE_EXSVC. Kontonamnet är inte skiftlägeskänsligt. Det angivna kontot måste börja med ett omvänt snedstreck (\) och får inte innehålla domänen som kontot tillhör. Kontot utelämnas för alla domäner där det förekommer.

Om du har använt migrationsverktyg eller katalogsynkroniseringsmetoder från andra tillverkare kan det finns ett annat konto i flera domäner med omfattande behörigheter för användarpostlådor. I sådana fall kan du ersätta "\Exchange Services" med namnet på det kontot.

Tips och risker

  • Ta inte bort log- och felfiler som genereras av skriptet. De kan bli värdefulla för felsökning eller för att ångra ändringar senare. Så snart du har gett Send As-behörighet till ett konto loggas det inte längre i exportfilen.
  • Om en Exchange-server eller Exchange-databas inte fungerar gör det att skriptbehandlingen går långsammare. I så fall kan du sortera Export-filen efter databas och flytta rader som är associerade med en stoppad databas till en annan fil för senare import.
  • Skriptet förhindrar utmatning av konton där inloggningsnamnet slutar med "$" eller är NT AUTHORITY\SYSTEM. De här systemkontona behöver normalt inte Send As-behörighet, och om du tar bort dem från Export-filen blir denna betydligt mindre.
  • Export-filen måste vara i Unicode-format innan den kan importeras. Om du av misstag har sparat filen som ANSI-text kan du läsa in den i Anteckningar och sedan spara den som Unicode-text.
  • Om importen inte fungerar felsöker du med testkonton och en enda rad i importfilen. Du bör konfigurera ett testkonto med en postlåda på en Exchange-server som körs, och sedan ge ett annat testkonto Full Mailbox Access-behörighet men inte Send As-behörighet.
  • Det finns inget Ångra-läge för det här skriptet. Om du vill ta bort Send As-behörigheterna du har gett med det här skriptet, måste du generera ett annat skript eller ta bort dem manuellt. Det finns inget Ångra-läge som gör att det här skriptet inte kan användas för att ta bort Send As-behörigheterna för alla användare i en organisation.
  • Skriptet ger inte korrekt hantering av ett konto med fullständig behörighet för ett användarobjekt tillsammans med Full Mailbox Access. I fullständig behörighet ingår Send As-behörigheten, men kontot exporteras genom skriptet som om det inte hade Send As-behörighet. Detta kan öka storleken av exportfilen, men det medför inga problem att importera filen och redundant ge Send As-behörighet till sådana konton.
  • Active Directory-användarkonton med unika namn som innehåller tabbtecken eller omatchade dubbla citattecken kan inte bearbetas med det här skriptet. Namn med matchade dubbla citattecken, till exempel
    ?CN=First ?Smeknamn? Last,DC=domän,DC=com?
    , kan bearbetas korrekt av skriptet.
  • I Excel kan filer med högst 65 535 rader hanteras. Om utdatafilen har fler rader måste den delas upp i mindre delar innan den läses in i Excel.
  • Send_As_Errors-filen innehåller en lista med konton där behörigheter inte har kunnat läsas eller skrivas. Om andra konton i domänen har bearbetats korrekt kan de här kontona ha något gemensamt som förhindrar att skriptet körs. Vanliga fel är till exempel följande:
    • Behörigheter för att visa eller ange egenskaper för kontona saknas.
    • Exchange-postlådearkivet körs inte.
    • Arbetsstationen är inte medlem av samma domän.
    • Administratörskontot som används kommer inte från samma skog.
Om du vill köra skriptet kopierar och klistrar du in alla rader mellan BEGIN SCRIPT och END SCRIPT i en textredigerare för oformaterad text som Anteckningar. Spara skriptet som AddSendAs.vbs. BEGIN SCRIPT
Option Explicit

Dim OUTPUT_DELIMITER
OUTPUT_DELIMITER = """""""" & vbTab & """"""""

'Define exclusive list, if FMA is given to any user in this list, it's ignored.  If you 
'want to modify this list, please be sure to follow the same format. Every alias has to 
'have a OUTPUT_DELIMITER before and after it
Dim FMA_EXCLUSIVE_LIST
FMA_EXCLUSIVE_LIST = OUTPUT_DELIMITER & "NT AUTHORITY\SELF" & OUTPUT_DELIMITER & "NT AUTHORITY\SYSTEM" & OUTPUT_DELIMITER
Dim FMA_EXCLUSIVE_EXSVC
FMA_EXCLUSIVE_EXSVC = "\Exchange Services" & OUTPUT_DELIMITER

'Permission Type: Allow or Deny
const ACCESS_ALLOWED_OBJECT_ACE_TYPE  = 5
const ADS_ACETYPE_ACCESS_ALLOWED = &h0
const ADS_ACETYPE_ACCESS_DENIED = &h1

'Flags: Specifies Inheritance
const ADS_ACEFLAG_INHERIT_ACE = &h2
const ADS_ACEFLAG_NO_PROPAGATE_INHERIT_ACE = &h4
const ADS_ACEFLAG_INHERIT_ONLY_ACE = &h8
const ADS_ACEFLAG_INHERITED_ACE = &h10
const ADS_ACEFLAG_VALID_INHERIT_FLAGS = &h1f
const ADS_ACEFLAG_SUCCESSFUL_ACCESS = &h40
const ADS_ACEFLAG_FAILED_ACCESS = &h80

'Declare ADSI constants
Const ADS_OPTION_SECURITY_MASK = 3
Const ADS_OPTION_REFERRALS	= 1
Const ADS_SECURITY_INFO_DACL = 4
Const ADS_CHASE_REFERRALS_NEVER = &h00 
Const ADS_CHASE_REFERRALS_SUBORDINATE = &h20 
Const ADS_CHASE_REFERRALS_EXTERNAL = &h40

'output file name
Const EXPORT_FILE = "Send_As_Export"
Const ERROR_FILE = "Send_As_Errors"

' script mode
const MODE_INVALID = -1 
const MODE_SETALL = 0
const MODE_EXPORT = 1
const MODE_IMPORT = 2
const SETALL = "-SETALL"
const EXPORT = "-EXPORT"
const IMPORT = "-IMPORT"

' argument index
Const ARG_INDEX_MODE = 1
Const ARG_INDEX_DC = 0
Const ARG_INDEX_FILENAME = 2

' column index in import/export file
Const COLUMN_INDEX_USERDISPLAYNAME = 0
Const COLUMN_INDEX_FMAALIAS = 1
Const COLUMN_INDEX_FMADISPLAYNAME = 2
Const COLUMN_INDEX_IFPUBLICDELEGATE = 3
Const COLUMN_INDEX_MAILBOXSTATUS = 4
Const COLUMN_INDEX_USERADSPATH = 5
Const COLUMN_INDEX_HOMEMDB = 6

Const EMPTYSTRING = ""
Const STRNO = "No Delegates"
Const STRYES = "Has Delegates" 
Const MIN_ARG = 2
Const INIT_ARRAY_SIZE = 100

' Microsoft Exchange 
Const EX_MB_SEND_AS_ACCESSMASK  = &H00100
Const EX_FULLMailbox_AccessMask = 1
Const MESO = "Microsoft Exchange System Objects"
Const EX_MB_SEND_AS_GUID = "{AB721A54-1E2F-11D0-9819-00AA0040529B}"

Const ForReading	= 1
Const ForWriting	= 2
Const ForAppending	= 8
Const TristateTrue	= -1
Const ADS_SCOPE_SUBTREE = 2

Dim objUser
Dim objSDMailBox
Dim objSDNTsecurity
Dim objDACLNTSD
Dim objNewACE

Dim sTrusteeAlias()
Dim sFMADeniedList
Dim sFMAExplicitAllow
Dim fACESendasFound
Dim dArraySize
Dim TotalACE
Dim i
Dim rootDSE
Dim conn
Dim objCommand
Dim objCmdDisplayName
Dim rsUsers
Dim FoundObject
Dim objFSO
Dim objfileImport
Dim objfileExport
Dim objfileError
Dim sImportFilePath
Dim cScriptMode
Dim dArgCount
Dim dArgExpected
Dim sDCServer
Dim sMailboxStatus
Dim sIfPublicDelegate
Dim sFMAUserDisplayName
Dim sExportFileName
Dim sErrorsFileName
Dim msPublicDelegates
Dim fError
Dim fOneError
Dim fFMAAllowed

On Error Resume Next
dArraySize = INIT_ARRAY_SIZE
ReDim Preserve sTrusteeAlias(dArraySize)

dArgCount = Wscript.Arguments.Count 
If ( dArgCount < MIN_ARG ) Then
	DisplaySyntax
End If

err.Clear
fError = False
fOneError = False
cScriptMode = MODE_INVALID
Select Case UCase(WScript.Arguments(ARG_INDEX_MODE))
	Case SETALL 
		cScriptMode = MODE_SETALL
		dArgExpected = ARG_INDEX_MODE + 1
	Case EXPORT 
		cScriptMode = MODE_EXPORT
		dArgExpected = ARG_INDEX_MODE + 1
	Case IMPORT 
		cScriptMode = MODE_IMPORT
		dArgExpected = ARG_INDEX_FILENAME + 1
	Case Else 
		cScriptMode = MODE_INVALID
End Select
If (cScriptMode = MODE_INVALID Or dArgCount <> dArgExpected) Then
	DisplaySyntax
End If

sDCServer = WScript.Arguments(ARG_INDEX_DC)

CreateOutputFiles

If ( cScriptMode = MODE_SETALL Or cScriptMode = MODE_EXPORT ) Then
	Dim sDomainContainer
	If (cScriptMode = MODE_SETALL) Then
		Dim strInput 
		WScript.StdOut.WriteLine("WARNING: If you continue, each account in the domain that has")
		WScript.StdOut.WriteLine("Full Mailbox Access permission for a given mailbox will also be")
		WScript.StdOut.WriteLine("granted permission to Send As the mailbox owner.")
		WScript.StdOut.WriteLine()
		WScript.StdOut.WriteLine("To preview the list of mailboxes before granting Send As,")
		WScript.StdOut.WriteLine("cancel this operation and use the -Export mode of this script.")
		WScript.StdOut.WriteLine()
		WScript.StdOut.Write("Press Y to continue or any other key to cancel: ")
		strInput = WScript.StdIn.ReadLine()
		If (UCase(strInput) <> UCase("Y")) Then
			WScript.Quit
		End If	
	End If
	
	WScript.StdOut.WriteLine()
	WScript.StdOut.WriteLine("""!"" indicates an error processing an object.")
	WScript.StdOut.WriteLine("     Check " & sErrorsFilename)
	WScript.StdOut.WriteLine("Starting...")
	WScript.StdOut.WriteLine()

	err.Clear	
	Set rootDSE = GetObject("LDAP://" & sDCServer & "/RootDSE")
	sDomainContainer = rootDSE.Get("defaultNamingContext")
	WScript.StdOut.WriteLine("Finding domain controller [ " & sDCServer & " ] for domain [ " & sDomainContainer & " ]")
	
	If (err.number <> 0) Then
		WScript.StdOut.WriteLine("Failed to find the domain or domain controller, error:" & err.Description)
		objfileError.WriteLine("Failed to find the domain or domain controller, error:" & err.Description)
		WScript.Quit
	End If
			
	err.Clear	
	Set conn = CreateObject("ADODB.Connection")
	Set objCommand = CreateObject("ADODB.Command")
	conn.Provider = "ADSDSOObject"
	conn.Open "ADs Provider"
	If (err.number <> 0) Then
		WScript.StdOut.WriteLine("Failed to bind to Active Directory server, error:" & err.Description)
		objfileError.WriteLine("Failed to bind to Active Directory server, error:" & err.Description)
		WScript.Quit
	End If

	Set objCommand.ActiveConnection = conn
	WScript.StdOut.WriteLine("Searching for mailbox owner user accounts in " & sDomainContainer)
	
	objCommand.CommandText  = "<LDAP://" & sDCServer & "/" & sDomainContainer & ">;(&(&(& (mailnickname=*) (| (&(objectCategory=person)(objectClass=user)(msExchHomeServerName=*)) ))));adspath;subtree"
	objCommand.Properties("searchscope") = ADS_SCOPE_SUBTREE
	objCommand.Properties("Page Size") = 100
	objCommand.Properties("Timeout") = 30 
	objCommand.Properties("Chase referrals") = (ADS_CHASE_REFERRALS_SUBORDINATE Or ADS_CHASE_REFERRALS_EXTERNAL)

	err.Clear	
	Set rsUsers = objCommand.Execute
	If (err.number <> 0) Then
		WScript.StdOut.WriteLine("Search for mailbox owners failed, error:" & err.Description)
		objfileError.WriteLine("Search for mailbox owners failed, error:" & err.Description)
		WScript.Quit
	End If

	If (rsUsers.RecordCount = 0) Then
		WScript.StdOut.WriteLine("No mailbox owner user accounts could be seen in " & sDomainContainer & ".")
		objfileError.WriteLine("No mailbox owner user accounts found in " & sDomainContainer & ".")
		fError = True		
	End If

	While Not rsUsers.EOF
		If (fOneError = True) Then
			WScript.StdOut.Write("!")
		Else
			WScript.StdOut.Write(".")
		End If
		fOneError = False
		
		'Skip any mailbox object in Microsoft Exchange System Objects container
		If (0 = Instr(rsUsers.Fields(0).Value, MESO)) Then
			err.Clear 
			Set objUser = GetObject(rsUsers.Fields(0).Value)
			If (err.number <> 0) Then
				objfileError.WriteLine("Failed to get user object: " & rsUsers.Fields(0).Value)
				objfileError.WriteLine("Error: " & err.Description)
				fError = True
				fOneError = True
				err.Clear
			End If
			Set objSDMailBox = objUser.MailboxRights
			If (err.number <> 0) Then
				objfileError.WriteLine("Failed to get mailbox rights: " & rsUsers.Fields(0).Value)
				objfileError.WriteLine("Error: " & err.Description)
				fError = True
				fOneError = True
				err.Clear
			End If
			Set objSDNTsecurity = objUser.ntSecurityDescriptor
			If (err.number <> 0) Then
				objfileError.WriteLine("Failed to get NTSD: " & rsUsers.Fields(0).Value)
				objfileError.WriteLine("Error: " & err.Description)
				fError = True
				fOneError = True
				err.Clear
			End If
			
			Set objDACLNTSD = Nothing
			If (objUser.AccountDisabled) Then
				sMailboxStatus = "Disabled"
			Else
				sMailboxStatus = "Enabled"
			End If

			'Query this user's publicDelegates list
			err.Clear 
			msPublicDelegates = objUser.Get("publicDelegates")
			If (err.number <> 0) Then
				'This user doesn't have publicDelegates list set
				sIfPublicDelegate = STRNO
				err.Clear
			Else
				sIfPublicDelegate = STRYES
			End If
			
			err.Clear 			
			FindAllFMAUsers objSDMailBox
			
			If (TotalACE > dArraySize) Then
			'Needs to allocate bigger size array
				dArraySize = TotalACE + 1
				ReDim Preserve sTrusteeAlias(dArraySize)
				FindAllFMAUsers objSDMailBox
			End If
			If (err.number <> 0) Then
				objfileError.WriteLine("Failed to query mailbox rights of user: " & rsUsers.Fields(0).Value)
				objfileError.WriteLine("Error: " & err.Description)
				err.Clear
				fError = True
				fOneError = True
			End If
			
			If TotalACE > 0 Then
				Set objDACLNTSD = objSDNTsecurity.DiscretionaryAcl

				For i = 0 to TotalACE - 1 Step 1
					
					'Check if we already have Send As ACE in NT security descriptor
					'If it exists, either allow or deny, we don't need to add send as to it 
					CheckSendAsACE objDACLNTSD, sTrusteeAlias(i)
					
					'Note: deny entries take precedence over allow entries. 
					'If there is FMA deny ACE, skip it even if we find FMA allow ACE 
					IfFMAAllowed(sTrusteeAlias(i) & OUTPUT_DELIMITER)
					If ((fFMAAllowed = True) And (fACESendasFound = 0)) Then
						If cScriptMode = MODE_SETALL Then
							Set objNewACE = CreateObject ("AccessControlEntry")
							objNewACE.AceFlags = 0 
							objNewACE.AceType = ACCESS_ALLOWED_OBJECT_ACE_TYPE
							objNewACE.AccessMask = EX_MB_SEND_AS_ACCESSMASK 
							objNewACE.Flags = 1
							objNewACE.ObjectType = EX_MB_SEND_AS_GUID
							objNewACE.Trustee = sTrusteeAlias(i)

							objDACLNTSD.AddAce objNewAce
						End If
			
						'Query trustee(FMA user) to get its displayName
						Dim rsTrustee
						Dim objTrustee
						Dim dPosition
						Dim sAlias
					
						dPosition = inStr(1, sTrusteeAlias(i), "\")
						sAlias = mid(sTrusteeAlias(i), dPosition + 1)
				
						Set objCmdDisplayName = CreateObject("ADODB.Command")			
						Set objCmdDisplayName.ActiveConnection = conn
						objCmdDisplayName.CommandText  = "<LDAP://" & sDomainContainer & ">;(&(&(& (mailnickname=" & sAlias & ") (| (&(objectCategory=person)(objectClass=user)(msExchHomeServerName=*)) ))));adspath;subtree"
						objCmdDisplayName.Properties("searchscope") = ADS_SCOPE_SUBTREE
						objCmdDisplayName.Properties("Page Size") = 100
						objCmdDisplayName.Properties("Timeout") = 30 
						objCmdDisplayName.Properties("Chase referrals") = (ADS_CHASE_REFERRALS_SUBORDINATE Or ADS_CHASE_REFERRALS_EXTERNAL)
						
						Set rsTrustee = objCmdDisplayName.Execute				
						Set objTrustee = GetObject(rsTrustee.Fields(0).Value)
						
						If (err.number <> 0) Then
							'Failed to query FMA user's display name, use its alias
							sFMAUserDisplayName = sAlias							
						Else
							sFMAUserDisplayName = objTrustee.displayName							
						End If
	
						'output to export file
						err.Clear
						objfileExport.WriteLine ("""""""" & objUser.displayName & OUTPUT_DELIMITER & sTrusteeAlias(i) & OUTPUT_DELIMITER & sFMAUserDisplayName & OUTPUT_DELIMITER & sIfPublicDelegate & OUTPUT_DELIMITER & sMailboxStatus & OUTPUT_DELIMITER & rsUsers.Fields(0).Value & OUTPUT_DELIMITER & objUser.homeMDB & """""""")
						If (err.number <> 0) Then
							objfileError.WriteLine("User " & rsUsers.Fields(0).Value & " could not be added to the export file. You should set permissions manually for this user.")
							objfileError.WriteLine("Error: " & err.Description)
							err.Clear
							fError = True
							fOneError = True
						End If
						Set objCmdDisplayName = Nothing
						Set rsTrustee = Nothing
						Set objTrustee = Nothing
					End If
				Next
					
				If cScriptMode = MODE_SETALL Then
					err.Clear
					objSDNTsecurity.DiscretionaryAcl = objDACLNTSD
					objUser.Put "ntSecurityDescriptor", Array( objSDNTsecurity )
					objUser.SetOption ADS_OPTION_SECURITY_MASK, ADS_SECURITY_INFO_DACL
					objUser.SetInfo
					If (err.number <> 0) Then
						objfileError.WriteLine("Failed to update ADSI for user: " & rsUsers.Fields(0).Value)
						objfileError.WriteLine("Error: " & err.Description)
						err.Clear
						fError = True
						fOneError = True
					End If
				End If

				TotalACE = 0
				Set objSDMailbox = Nothing
				Set objSDNTsecurity = Nothing
				Set objUser = Nothing
				Set objDACLNTSD = Nothing
			End If
		
		End If	
		rsUsers.MoveNext
	Wend
End If

If (cScriptMode = MODE_IMPORT) Then
	Dim sOneRow
	Dim sArraySplit
	Dim objUserItem
	Dim UserPath
	Dim objUserSD
	Dim objUserDACL
	Dim fNeedToAddSendAs
	
	sImportFilePath = WScript.Arguments(ARG_INDEX_FILENAME)

	WScript.StdOut.WriteLine("If you continue, each account listed in " & sImportFilePath)
	WScript.StdOut.WriteLine("that has Full Mailbox Access permission for a given mailbox")
	WScript.StdOut.WriteLine("will also be granted permission to Send As the mailbox owner.")
	WScript.StdOut.WriteLine()
	WScript.StdOut.Write("Press Y to continue or any other key to cancel: ")
	strInput = WScript.StdIn.ReadLine()
	If (UCase(strInput) <> UCase("Y")) Then
		WScript.Quit
	End If	
	WScript.StdOut.WriteLine("Starting...")
	WScript.StdOut.WriteLine()

	UserPath = EMPTYSTRING	
	err.Clear	
	Set objFSO = CreateObject("Scripting.FileSystemObject")
	Set objfileImport = objFSO.OpenTextFile(sImportFilePath, ForReading, False, TristateTrue)
	If (err.number <> 0) Then
		WScript.StdOut.WriteLine("Failed to open import file " & sImportFilePath & ", error:" & err.Description)
		objfileError.WriteLine("Failed to open import file " & sImportFilePath & ", error:" & err.Description)
		WScript.Quit
	End If	

	fNeedToAddSendAs = False
	Do While objfileImport.AtEndOfStream <> True
		If (fOneError = True) Then
			WScript.StdOut.Write("!")
		Else
			WScript.StdOut.Write(".")
		End If
		fOneError = False

		err.Clear
		sOneRow = objfileImport.ReadLine
		sArraySplit = Split(sOneRow , OUTPUT_DELIMITER)
		If (err.number <> 0) Then
			objfileError.WriteLine("Failed to parse one row: " & sOneRow )
			objfileError.WriteLine("Error: " & err.Description)
			err.Clear
			fError = True
			fOneError = True
		End If
		
		If (UserPath <> sArraySplit(COLUMN_INDEX_USERADSPATH)) Then
			'A new user
			If (fNeedToAddSendAs = True ) Then
				'update existing user
				err.Clear 
				objSDNTsecurity.DiscretionaryAcl = objDACLNTSD
				objUser.Put "ntSecurityDescriptor", Array( objSDNTsecurity )
				objUser.SetOption ADS_OPTION_SECURITY_MASK, ADS_SECURITY_INFO_DACL
				objUser.SetInfo
				If (err.number <> 0) Then
					objfileError.WriteLine("Failed to update permissions for user: " & UserPath)
					objfileError.WriteLine("Error: " & err.Description)
					fError = True
					fOneError = True
				End If
			End If
						
			fNeedToAddSendAs = False
			Set objUser = Nothing
			Set objSDNTsecurity = Nothing
			Set objDACLNTSD = Nothing

			UserPath = sArraySplit(COLUMN_INDEX_USERADSPATH)
			err.Clear 
			Set objUser = GetObject(UserPath)
			Set objSDNTsecurity = objUser.ntSecurityDescriptor  
			Set objDACLNTSD = objSDNTsecurity.DiscretionaryACL			
			If (err.number <> 0) Then
				objfileError.WriteLine("Failed to get user object: " & UserPath)
				objfileError.WriteLine("Error: " & err.Description)
				err.Clear
				fError = True
				fOneError = True
			End If
		End If
	
		'Add newACE   Do we need this check?
		CheckSendAsACE objDACLNTSD, sArraySplit(COLUMN_INDEX_FMAALIAS)
		If (fACESendasFound = 0) Then
			Set objNewACE = CreateObject ("AccessControlEntry")
			objNewACE.AceFlags = 0 
			objNewACE.AceType = ACCESS_ALLOWED_OBJECT_ACE_TYPE
			objNewACE.AccessMask = EX_MB_SEND_AS_ACCESSMASK 
			objNewACE.Flags = 1
			objNewACE.ObjectType = EX_MB_SEND_AS_GUID
			objNewACE.Trustee = sArraySplit(COLUMN_INDEX_FMAALIAS)

			objDACLNTSD.AddAce objNewACE
			fNeedToAddSendAs = True			
		End If
	Loop
	
	If (fNeedToAddSendAs = True ) Then
		'update the last user
		err.Clear 
		objSDNTsecurity.DiscretionaryAcl = objDACLNTSD
		objUser.Put "ntSecurityDescriptor", Array( objSDNTsecurity )
		objUser.SetOption ADS_OPTION_SECURITY_MASK, ADS_SECURITY_INFO_DACL
		objUser.SetInfo
		If (err.number <> 0) Then
			objfileError.WriteLine("Failed to update permissions for user: " & UserPath)
			objfileError.WriteLine("Error: " & err.Description)
			fError = True
		End If
	End If

End If 

objFSO.Close
objfileImport.Close
objfileExport.Close
objfileError.Close

Set objFSO = Nothing
Set objfileImport = Nothing
Set objfileExport = Nothing
Set objfileError = Nothing
Set objCommand = Nothing
Set conn = Nothing

WScript.StdOut.WriteLine()
If (fError = True) Then
	WScript.StdOut.WriteLine("Finished with one or more errors. See " & sErrorsFilename)
Else
	WScript.StdOut.WriteLine("Finished successfully. No errors were encountered.")
End If

Function FindAllFMAUsers (objSD)
Dim objACL
Dim objACE
Dim intACECount
Dim strIndent
Dim dAccessMaskBit
Dim dPosition
Dim sUserAlreadyFound

	On Error Resume Next
	err.Clear
	TotalACE = 0
	sFMADeniedList = EMPTYSTRING
	sFMAExplicitAllow = EMPTYSTRING
	sUserAlreadyFound = OUTPUT_DELIMITER
	intACECount = 0
	Set objACL = objSD.DiscretionaryAcl
	intACECount = objACL.AceCount

	If intACECount Then
		' Open discretionary ACL (DACL) data.
		For Each objACE In objACL		
			
		dPosition = inStr(1, objACE.Trustee, "$")
		If ((0 = Instr(UCase(objACE.Trustee & OUTPUT_DELIMITER), UCase(FMA_EXCLUSIVE_EXSVC))) And (0 = Instr(sUserAlreadyFound, OUTPUT_DELIMITER & objACE.Trustee & OUTPUT_DELIMITER)) And (0 = Instr(FMA_EXCLUSIVE_LIST, OUTPUT_DELIMITER & objACE.Trustee & OUTPUT_DELIMITER)) And (dPosition <> Len(objACE.Trustee)) And ((objACE.AccessMask And EX_FULLMailbox_AccessMask) <>0) And ((objACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED) Or (objACE.AceType = ACCESS_ALLOWED_OBJECT_ACE_TYPE) )) Then
			If (TotalACE < dArraySize) Then
				sTrusteeAlias(TotalACE) = objACE.Trustee
				sUserAlreadyFound = sUserAlreadyFound & objACE.Trustee & OUTPUT_DELIMITER
			End If
			TotalACE = TotalACE + 1	
			If ((objACE.AceFlags And ADS_ACEFLAG_INHERITED_ACE) = 0) Then
				'Keep a list who explictly set FMA at mailbox level
				sFMAExplicitAllow = sFMAExplicitAllow & objACE.Trustee & OUTPUT_DELIMITER			
			End If
		ElseIf (( (objACE.AccessMask And EX_FULLMailbox_AccessMask) <>0 ) And (objACE.AceType = ADS_ACETYPE_ACCESS_DENIED)) Then
			'Keep a list who denied FMA, use OUTPUT_DELIMITER as demiliter, 
			'include both inherited and explicit set at mailbox level
			sFMADeniedList = sFMADeniedList & objACE.Trustee & OUTPUT_DELIMITER			
		End If
		Next
	End If

	Set objACL = Nothing
End Function

Function CheckSendAsACE (objDiscretionaryACL, sTAlias)
Dim objACE
Dim intACECount

	err.Clear 
	fACESendasFound = 0
	intACECount = objDiscretionaryACL.AceCount

	If intACECount Then
		For Each objACE In objDiscretionaryACL	
			err.Clear 
			If ( (objACE.Trustee = sTAlias) And (objACE.ObjectType = EX_MB_SEND_AS_GUID) ) Then
				fACESendasFound = 1
			End If
			If (err.number <> 0) Then
				objfileError.WriteLine("Could not read permissions for this user: " & sTAlias)
				objfileError.WriteLine("Error: " & err.Description)
				err.Clear
				fError = True
				fOneError = True
			End If			
		Next			
	End If	
End Function

Function IfFMAAllowed(sTrustee)
	'FMA allow ACE has been found. Assume it's true
	fFMAAllowed = True
	
	If ( (0 <> Instr(sFMADeniedList, sTrustee)) And (0 = Instr(sFMAExplicitAllow, sTrustee))	) Then
		'If Denied ACE is found, and no explicit allow FMA 
		fFMAAllowed = False
	End If 
End Function

Function CreateOutputFiles
	Dim sTimeArray
	Dim sTimeShort
	Dim sTime
	
	err.Clear
	sTime = Time
	sTimeShort = Split(sTime, " ")
	sTimeArray = Split(sTimeShort(0), ":")

	Set objFSO = CreateObject("Scripting.FileSystemObject")
	sErrorsFileName = ERROR_FILE & "_" & sTimeArray(0) & "_" & sTimeArray(1) & "_" & sTimeArray(2) & ".txt"
	Set objfileError = objFSO.OpenTextFile(sErrorsFileName, ForWriting, True, TristateTrue)

	If (cScriptMode = MODE_SETALL Or cScriptMode = MODE_EXPORT)	Then
		sExportFileName = EXPORT_FILE & "_" & sTimeArray(0) & "_" & sTimeArray(1) & "_" & sTimeArray(2) & ".txt"
		Set objfileExport = objFSO.OpenTextFile(sExportFileName, ForWriting, True, TristateTrue)	
	End If
	
	If err.number <> 0 Then
		WScript.StdOut.WriteLine("Unable to create export or error files: " & err.Description)
		objfileError.WriteLine("Unable to create export or error files: " & err.Description)
		fError = True
		fOneError = True
		WScript.Quit	
	End If

End Function

Function DisplaySyntax
	WScript.StdOut.WriteLine("Syntax:")
	WScript.StdOut.WriteLine()
	WScript.StdOut.WriteLine("Export accounts with Full Mailbox Access that do not have Send As permission:")
	WScript.StdOut.WriteLine("     CSCRIPT """ & WScript.ScriptName & """ DOMAIN_CONTROLLER -Export")
	WScript.StdOut.WriteLine("         NOTE: The list will be saved to Send_As_Export_HH_MM_SS.txt")
	WScript.StdOut.WriteLine()
	WScript.StdOut.WriteLine("Grant Send As to all accounts listed in an export file:")
	WScript.StdOut.WriteLine("     CSCRIPT """ & WScript.ScriptName & """ DOMAIN_CONTROLLER -Import ""filename.txt""")
	WScript.StdOut.WriteLine()
	WScript.StdOut.WriteLine("Grant Send As to all accounts in the domain with Full Mailbox Access:")
	WScript.StdOut.WriteLine("     CSCRIPT """ & WScript.ScriptName & """ DOMAIN_CONTROLLER -SetAll")
	WScript.StdOut.WriteLine("         NOTE: Accounts will be listed in Send_As_Export_HH_MM_SS.txt")
	WScript.StdOut.WriteLine()
	WScript.StdOut.WriteLine("For all modes, errors are saved to Send_As_Errors_HH_MM_SS.txt")

	WScript.Quit	
End Function
END SCRIPT

Microsoft tillhandahåller programmeringsexempel enbart i förklarande syfte och gör inga utfästelser, varken uttryckligen eller underförstått. Detta omfattar men begränsas inte till underförstådd garanti för säljbarhet eller lämplighet för ett visst syfte. I denna artikel förutsätts att du känner till det programmeringsspråk som demonstreras och de verktyg som används för att skapa och felsöka procedurer. Microsofts supporttekniker kan hjälpa till med att förklara funktionen hos en viss procedur, men kan inte ändra dessa exempel för att ge ytterligare funktioner eller skapa procedurer som motsvarar dina speciella behov.
Ytterligare information om supportalternativ från Microsoft finns på följande Microsoft-webbplats:
http://support.microsoft.com/contactus/?ws=support
De produkter från andra tillverkare som diskuteras i denna artikel tillverkas oberoende av Microsoft. Produkternas funktion eller tillförlitlighet kan därför inte garanteras.

Egenskaper

Artikel-id: 912918 - Senaste granskning: den 26 november 2007 - Revision: 17.2
Informationen i denna artikel gäller:
  • Microsoft Exchange 2000 Server Standard Edition
  • Microsoft Exchange 2000 Enterprise Server
  • Microsoft Exchange Server 2003 Standard Edition
  • Microsoft Exchange Server 2003 Enterprise Edition
Nyckelord: 
kbtshoot kbpending kbbug kbprb KB912918

Ge feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com