Du arbetar offline, väntar på att återansluta till Internet

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

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 Ge Send As-behörighet för flera konton 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: Om du använder BlackBerry Enterprise Server 3.6 besöker du följande BlackBerry-webbplats:

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:
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] –SetAllEtt 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 ExplicitDim OUTPUT_DELIMITEROUTPUT_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 itDim FMA_EXCLUSIVE_LISTFMA_EXCLUSIVE_LIST = OUTPUT_DELIMITER & "NT AUTHORITY\SELF" & OUTPUT_DELIMITER & "NT AUTHORITY\SYSTEM" & OUTPUT_DELIMITERDim FMA_EXCLUSIVE_EXSVCFMA_EXCLUSIVE_EXSVC = "\Exchange Services" & OUTPUT_DELIMITER'Permission Type: Allow or Denyconst ACCESS_ALLOWED_OBJECT_ACE_TYPE  = 5const ADS_ACETYPE_ACCESS_ALLOWED = &h0const ADS_ACETYPE_ACCESS_DENIED = &h1'Flags: Specifies Inheritanceconst ADS_ACEFLAG_INHERIT_ACE = &h2const ADS_ACEFLAG_NO_PROPAGATE_INHERIT_ACE = &h4const ADS_ACEFLAG_INHERIT_ONLY_ACE = &h8const ADS_ACEFLAG_INHERITED_ACE = &h10const ADS_ACEFLAG_VALID_INHERIT_FLAGS = &h1fconst ADS_ACEFLAG_SUCCESSFUL_ACCESS = &h40const ADS_ACEFLAG_FAILED_ACCESS = &h80'Declare ADSI constantsConst ADS_OPTION_SECURITY_MASK = 3Const ADS_OPTION_REFERRALS	= 1Const ADS_SECURITY_INFO_DACL = 4Const ADS_CHASE_REFERRALS_NEVER = &h00 Const ADS_CHASE_REFERRALS_SUBORDINATE = &h20 Const ADS_CHASE_REFERRALS_EXTERNAL = &h40'output file nameConst EXPORT_FILE = "Send_As_Export"Const ERROR_FILE = "Send_As_Errors"' script modeconst MODE_INVALID = -1 const MODE_SETALL = 0const MODE_EXPORT = 1const MODE_IMPORT = 2const SETALL = "-SETALL"const EXPORT = "-EXPORT"const IMPORT = "-IMPORT"' argument indexConst ARG_INDEX_MODE = 1Const ARG_INDEX_DC = 0Const ARG_INDEX_FILENAME = 2' column index in import/export fileConst COLUMN_INDEX_USERDISPLAYNAME = 0Const COLUMN_INDEX_FMAALIAS = 1Const COLUMN_INDEX_FMADISPLAYNAME = 2Const COLUMN_INDEX_IFPUBLICDELEGATE = 3Const COLUMN_INDEX_MAILBOXSTATUS = 4Const COLUMN_INDEX_USERADSPATH = 5Const COLUMN_INDEX_HOMEMDB = 6Const EMPTYSTRING = ""Const STRNO = "No Delegates"Const STRYES = "Has Delegates" Const MIN_ARG = 2Const INIT_ARRAY_SIZE = 100' Microsoft Exchange Const EX_MB_SEND_AS_ACCESSMASK  = &H00100Const EX_FULLMailbox_AccessMask = 1Const MESO = "Microsoft Exchange System Objects"Const EX_MB_SEND_AS_GUID = "{AB721A54-1E2F-11D0-9819-00AA0040529B}"Const ForReading	= 1Const ForWriting	= 2Const ForAppending	= 8Const TristateTrue	= -1Const ADS_SCOPE_SUBTREE = 2Dim objUserDim objSDMailBoxDim objSDNTsecurityDim objDACLNTSDDim objNewACEDim sTrusteeAlias()Dim sFMADeniedListDim sFMAExplicitAllowDim fACESendasFoundDim dArraySizeDim TotalACEDim iDim rootDSEDim connDim objCommandDim objCmdDisplayNameDim rsUsersDim FoundObjectDim objFSODim objfileImportDim objfileExportDim objfileErrorDim sImportFilePathDim cScriptModeDim dArgCountDim dArgExpectedDim sDCServerDim sMailboxStatusDim sIfPublicDelegateDim sFMAUserDisplayNameDim sExportFileNameDim sErrorsFileNameDim msPublicDelegatesDim fErrorDim fOneErrorDim fFMAAllowedOn Error Resume NextdArraySize = INIT_ARRAY_SIZEReDim Preserve sTrusteeAlias(dArraySize)dArgCount = Wscript.Arguments.Count If ( dArgCount < MIN_ARG ) Then	DisplaySyntaxEnd Iferr.ClearfError = FalsefOneError = FalsecScriptMode = MODE_INVALIDSelect 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_INVALIDEnd SelectIf (cScriptMode = MODE_INVALID Or dArgCount <> dArgExpected) Then	DisplaySyntaxEnd IfsDCServer = WScript.Arguments(ARG_INDEX_DC)CreateOutputFilesIf ( 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	WendEnd IfIf (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 IfEnd If objFSO.CloseobjfileImport.CloseobjfileExport.CloseobjfileError.CloseSet objFSO = NothingSet objfileImport = NothingSet objfileExport = NothingSet objfileError = NothingSet objCommand = NothingSet conn = NothingWScript.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 IfFunction FindAllFMAUsers (objSD)Dim objACLDim objACEDim intACECountDim strIndentDim dAccessMaskBitDim dPositionDim 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 = NothingEnd FunctionFunction CheckSendAsACE (objDiscretionaryACL, sTAlias)Dim objACEDim 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 FunctionFunction 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 FunctionFunction 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 IfEnd FunctionFunction 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: 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.
XADM Blackberry Enterprise Server BES GoodLink Cisco Unified Messaging RIM
Egenskaper

Artikel-id: 912918 – senaste granskning 11/26/2007 01:53:44 – revision: 17.2

  • Microsoft Exchange 2000 Server Standard Edition
  • Microsoft Exchange 2000 Enterprise Server
  • Microsoft Exchange Server 2003 Standard Edition
  • Microsoft Exchange Server 2003 Enterprise Edition
  • kbtshoot kbpending kbbug kbprb KB912918
Feedback